2017-06-13 195 views
0

我有两个数据帧。数据帧的值替换 - R

一:

>df1   a  b  c  d 
    W_1  NA NA NA NA 
    W_2  2  2  2  4 
    W_3  4  2  2  4 
    W_4  NA NA NA NA 

二:

>df2  a  b  c  d 
    W_1 TRUE FALSE FALSE FALSE 
    W_2 FALSE TRUE FALSE TRUE 
    W_3 TRUE FALSE FALSE TRUE 
    W_4 FALSE TRUE FALSE TRUE 

我要替换第一数据帧与NA,其中在第二个数据帧值FALSE地方。

输出应该是:

  a  b  c  d 
W_1  NA NA NA NA 
W_2  NA  2 NA  4 
W_3  4 NA NA  4 
W_4  NA NA NA NA 

这是我的代码:

for (i in nrow(df2)) { 
    for (j in 1:ncol(df2)) { 
    a = df2[i,j] 
    if (a == FALSE) { 
     df1[i,j] = NA 
    } 
    } 
} 

虽然我没有得到任何错误返回,代码也不起作用。第一个数据帧保持不变。任何建议可能是错误的?

感谢您的帮助。

+2

'DF1 [!DF2] < - NA'应该这样做 – Cath

+3

或者像'is.na(df1)< - !df2' – Frank

+1

@quant比较'FALSE ==“FALSE”'和'“FALSE”==“FALSE''。强制节省时间。 – Frank

回答

6

如果行/的df2比赛的cols准确的df1的那些,你可以只使用在df2逻辑值替换要在df1什么:

df1[!df2] <- NA 

@Frank的工作方式同样:

is.na(df1) <- !df2 

实施例:

df1 <- data.frame(matrix(1:16, ncol=4)) 
set.seed(123) 
df2 <- data.frame(matrix(sample(c(TRUE, FALSE), 16, replace=TRUE), ncol=4)) 
df1[!df2] <- NA # or is.na(df1) <- !df2 
df1 
# X1 X2 X3 X4 
#1 1 NA NA NA 
#2 NA 6 10 NA 
#3 3 NA NA 15 
#4 NA NA 12 NA 
+0

它给了我一个错误'错误在乐趣(左):无效参数类型',它是什么意思? –

+0

@ bass.bz你可以使用'dput'来给我们的数据结构,否则很难说出发生了什么 – Cath

2

我们可以高效setdata.table

library(data.table) 
setDT(df1) 
for(j in seq_along(df1)){ 
set(df1, i = which(!df2[[j]]), j=j, value = NA) 
} 

df1 
# a b c d 
#1: NA NA NA NA 
#2: NA 2 NA 4 
#3: 4 NA NA 4 
#4: NA NA NA NA 

做到这一点作为@Frank在评论中提到的,它也将工作,无须转换为data.table

for(j in seq_along(df1)){ 
    set(df1, i = which(!df2[[j]]), j=j, value = NA) 
    } 
df1 
#  a b c d 
#W_1 NA NA NA NA 
#W_2 NA 2 NA 4 
#W_3 4 NA NA 4 
#W_4 NA NA NA NA 
+0

只有当两个数据帧中的行数相同时,它才有效? –

+0

@ bass.bz是的,它基于你的例子。如果不一样,不确定你想要替换值的逻辑 – akrun