在两个数据帧中有条件地替换NA

时间:2016-09-21 16:35:27

标签: r replace dataframe na

可能是简单但棘手的问题,尤其是对于较大的数据集。给定两个相同维度的数据帧(df1df2),如下所示:

 head(df1)
          a          b  c
1 0.8569720 0.45839112 NA
2 0.7789126 0.36591578 NA
3 0.6901663 0.88095485 NA
4 0.7705756 0.54775807 NA
5 0.1743111 0.89087819 NA
6 0.5812786 0.04361905 NA

head(df2)
           a         b  c
1 0.21210312 0.7670091 NA
2 0.19767464 0.3050934  1
3 0.08982958 0.4453491  2
4 0.75196925 0.6745908  3
5 0.73216793 0.6418483  4
6 0.73640209 0.7448011  5

如何找到if(all(is.na(df1))的所有列,在这种情况下为c,转到df2并将匹配列(c)中的所有值设置为{{1 }}

所需的输出

NAs

我的实际数据框的列数超过head(df3) a b c 1 0.21210312 0.7670091 NA 2 0.19767464 0.3050934 NA 3 0.08982958 0.4453491 NA 4 0.75196925 0.6745908 NA 5 0.73216793 0.6418483 NA 6 0.73640209 0.7448011 NA

1 个答案:

答案 0 :(得分:3)

我们可以在否定的逻辑矩阵(colSums)上使用is.na(df1),否定(!) the vector`,这样0个非NA元素变为TRUE,其他所有元素变为FALSE,使用此将' df2'的列子集,并将其分配给NA。

df2[!colSums(!is.na(df1))] <- NA
df2
#           a         b  c
#1 0.21210312 0.7670091 NA
#2 0.19767464 0.3050934 NA
#3 0.08982958 0.4453491 NA
#4 0.75196925 0.6745908 NA
#5 0.73216793 0.6418483 NA
#6 0.73640209 0.7448011 NA

或另一种选择是循环列并检查all元素是否为NA以创建逻辑向量以对“df2”的列进行子集化。并将其分配给NA

df2[sapply(df1, function(x) all(is.na(x)))] <- NA

如果这些是大数据集,则另一个选项是来自set的{​​{1}}(应该更高效,因为这样做了分配)

data.table