R:根据dataframe2

时间:2015-12-09 16:54:57

标签: r

我有两个相同尺寸的数据帧(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。也不确定这是否是最有效的任务方法。

任何建议都将不胜感激。

3 个答案:

答案 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