有条件地替换两个数据帧 R 中的 NA
Conditional replacement of NAs in two dataframes R
可能是一个简单但棘手的问题,尤其是对于较大的数据集。给定两个尺寸相等的数据框 (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
列。
我们可以在取反逻辑矩阵 (is.na(df1)
) 上使用 colSums
,取反 (!) 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
来自 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)
}
可能是一个简单但棘手的问题,尤其是对于较大的数据集。给定两个尺寸相等的数据框 (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
列。
我们可以在取反逻辑矩阵 (is.na(df1)
) 上使用 colSums
,取反 (!) 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
来自 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)
}