0

次のデータフレームがあります。

> df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'))
> df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA))
> df1
  ind    x
1   1    a
2   2    b
3   3 <NA>
4   4    d
> df2
  ind    x
1   1 <NA>
2   2 <NA>
3   3    c
4   4 <NA>

それらを組み合わせて、df1の欠落値をdf2の数値で埋めます。どうやってやるの?マージコマンドでも結合コマンドでもそれを行うことはできません。

> merge(df1, df2, by='ind', all=T)
  ind  x.x  x.y
1   1    a <NA>
2   2    b <NA>
3   3 <NA>    c
4   4    d <NA>
4

3 に答える 3

3

テストケースを構築した方法は要因を生み出し、レベルが合同ではないため、コンパクトなソリューションに追加の障壁を課します。レベル=一意の値の和集合を使用して因子を作成するか、できれば文字ベクトルを使用することができます。

df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'), stringsAsFactors=FALSE)
df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA), stringsAsFactors=FALSE)
df1[is.na(df1)] <- df2[is.na(df1)] # the key is same index on both sides
 df1
#---------
  ind x
1   1 a
2   2 b
3   3 c
4   4 d

おそらくあまり好ましくない方法(ただし、再処理したくないインプレースデータセットのペアには適している可能性があります)は次のようになります。

 df1$x <- factor(df1$x, levels=union(levels(df1$x), levels(df2$x) ) )
 df2$x <- factor(df2$x, levels=union(levels(df1$x), levels(df2$x) ) )
 df1[is.na(df1)] <- df2[is.na(df1)]
于 2012-04-18T14:52:32.913 に答える
1

これはどう:

rbind(df1[complete.cases(df1),],df2[complete.cases(df2),])
  index x
1     1 a
2     2 b
3     3 c
4     4 d
于 2012-04-18T14:23:30.097 に答える
1

両方のデータセットにある場合xはどうしますか?NAこれはあなたが望むことをしますか?

x <- merge(df1, df2, all = TRUE, by = "ind")
x <- transform(x, newcol = ifelse(is.na(x.x), as.character(x.y), as.character(x.x)))

> x
  ind  x.x  x.y newcol
1   1    a <NA>      a
2   2    b <NA>      b
3   3 <NA>    c      c
4   4    d <NA>      d
于 2012-04-18T14:44:13.643 に答える