我有两个相同尺寸的数据帧(120万行x 5000列)。这些数据帧的子集df1和df2如下:
df1<-data.frame(A=c(0,0,1),B=c(0,1,0),C=c(2,1,0),D=c(0,NA,0),E=c(1,0,1))
rownames(df1) <- c("A1", "A2", "B1")
df1
# A B C D E
# A1 0 0 2 0 1
# A2 0 1 1 NA 0
# B1 1 0 0 0 1
df2<-data.frame(A=c(106,NA,61),B=c(127,22,10), C=c(9,NA,126), D=c(1,77,54), E=c(99,87,2))
rownames(df2) <- c("A1", "A2", "B1")
df2
# A B C D E
# A1 106 127 9 1 99
# A2 NA 22 NA 77 87
# B1 61 10 126 54 2
我想根据df2中的相应值更新df1中的值,如下所示: 如果df2中的单元格值为NA或者df2中的单元格值小于或等于10,则将df1中的对应值更改为NA。否则,将df1中的值保持不变。
我能够获得一个逻辑数据帧,我认为我可以将其用作某种查找表:
df1A <- df1
df1A <- ifelse(df2<=10, df1==NA, df1==df1)
# A B C D E
# A1 TRUE TRUE NA NA TRUE
# A2 NA TRUE NA NA TRUE
# B1 TRUE NA TRUE TRUE NA
在df1A中,每个TRUE单元对应于df1中应保持不变的值,每个NA单元对应于df1中应更改为(或保持为)NA的值。但是,我不确定如何使用df1A更新df1。也不确定这是否是最有效的任务方法。
任何建议都将不胜感激。
答案 0 :(得分:3)
简单的方法。
df1[is.na(df2)|df2<=10] <- NA
df1
# A B C D E
# A1 0 0 NA NA 1
# A2 NA 1 NA 0 0
# B1 1 NA 0 0 NA
答案 1 :(得分:2)
Map
的一种方式:
#Map works like a 'double' lapply
#in a sense that in each iteration the same
#column (in terms of the index) for each data.frame
#will be passed on to x and y
df1[] <- Map(function(x,y) {
#y reflects the columns of df2
#so if y is na or less or equal to 10 then return NA else df1
ifelse(is.na(y) | y<=10, NA, x)
},
df1, df2)
输出:
> df1
A B C D E
A1 0 0 NA NA 1
A2 NA 1 NA 0 0
B1 1 NA 0 0 NA
答案 2 :(得分:1)
以下是使用data.table
的{{1}}方法。它应该是有效的,因为避免了set
中的开销。我们将第一个数据集转换为data.table([.data.table
),然后循环遍历setDT(df1)
循环中的列。
for