从另一个data.frame

时间:2016-05-03 22:48:19

标签: r

我有一个带行和列名称的N x M数据帧DF1,其中许多值都是NA。存在第二个数据帧DF2(1×M,因此实际上可以是矢量),其行名称与DF1相同。我想使用DF2来填充DF1列中的缺失值。

任何帮助都会非常感激。

Udp:对不起,真的应该附上一个例子

具有NAs的数据帧

> df = data.frame(matrix(rnorm(9), nrow=3))
> df[1,1] <- NA
> df[2,2] <- NA
> df[3,3] <- NA
          X1         X2         X3
1         NA -0.1364313         NA
2 -0.7473972         NA -0.1662138

替换值(相同的行名,列名 - 不相关

df2 = data.frame(c(1,2))
  c.1..2.
1       1
2       2

预期产出:

          X1         X2         X3
1         1  -0.1364313          1
2 -0.7473972          2 -0.1662138

2 个答案:

答案 0 :(得分:1)

我认为这是一种做法。首先,我创建了一个新的data.framenew_df),只选择了匹配的行,然后对数据执行sapply以替换NA值。

set.seed(123)
df = data.frame(matrix(rnorm(9), nrow=3))
 df[1,1] <- NA
 df[2,2] <- NA
 df[3,3] <- NA
 df2 <- data.frame(c(1,2))
#create new data.frame
new_df <- df[which(row.names(df2) == row.names(df)),]
#use sapply() 
t(sapply(row.names(df2), FUN = function(x) 
     ifelse(is.na(new_df[row.names(new_df) == x,]), 
            df2[row.names(df2)== x,], 
            new_df[row.names(new_df) == x,])))

  [,1]       [,2]       [,3]     
1 1          0.07050839 0.4609162
2 -0.2301775 2          -1.265061

请注意,这会导致列名丢失......这可能意味着有更好的方法。此外,我的数据不同,因为我们没有使用set.seed

答案 1 :(得分:1)

您还可以执行一个简单的for循环来处理这个问题:

for(i in 1:dim(df)[1]){
    df[i,is.na(df[i,])] <- df2[i,]
}