【问题标题】:Conditional replacement of NAs in two dataframes R有条件地替换两个数据帧 R 中的 NA
【发布时间】:2017-01-30 00:38:30
【问题描述】:

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

 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)中的所有值设置为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

我的实际数据框有多个 140000 列。

【问题讨论】:

标签: r replace dataframe na


【解决方案1】:

我们可以在取反逻辑矩阵 (is.na(df1)) 上使用 colSums,取反 (!) thevector` 以便 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 from data.table(应该更有效,因为这样可以完成分配)

library(data.table)
setDT(df2)
j1 <-  which(sapply(df1, function(x) all(is.na(x))))

for(j in j1){
   set(df2, i = NULL, j = j, value = NA)
}

【讨论】:

  • 感谢您的聪明回答。它工作得很好,但需要时间才能在 dfdim = 4779 rows and 141743 columns 上完成。
  • @code123 我还添加了data.table 解决方案。请检查这是否有任何区别
猜你喜欢
  • 2018-12-11
  • 2019-01-07
  • 2021-06-27
  • 2014-04-10
  • 1970-01-01
  • 2020-10-26
  • 2021-11-05
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多