比较多列中的值并根据比较结果填充其他列

时间:2016-06-30 12:47:15

标签: r

我在第1列(标题为“日期”的列)和第2列到第4列(标题为“A” - >“C”的列)中有一个日期表。

Date   A  B  C
1/1/16 X X Y 
1/2/16 X Y Y
1/3/16 X Y Z

etc.

我需要创建包含以下内容的其他第5列D:

每行:

如果A,B或C = X列中的3个值中有2个,那么D = X中的值

如果A,B或C中的任何一列中的3个值中有2个= Y,则列D = Y中的值

列D = Z

中的任何其他值

期望的输出:

Date   A  B  C  D
1/1/16 X X Y X
1/2/16 X Y Y Y
1/3/16 X Y Z Z

我已经尝试过前面推荐的用于比较值的逻辑,但是它给了我一堆错误,显然“=”符号是禁止的:

df$D <- NA  
df$D[df$A = df$B = X or df$B = df$C = X or df$A = df$C = Y] <- "X"
df$D[df$A = df$B = Y or df$B = df$C = Y or df$A = df$C = Y] <- "Y"
df$D[is.na(df$E)]               <- "Z"
  

错误:“df $ D [df $ A =”

中的意外'='

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

这是一种使用rowMeans的方法。

# assign all of D to "Z"
df$D <- "Z"
# replace values
df$D[rowMeans(df[, 2:(length(df)-1)] == "X") > 0.5] <- "X"
df$D[rowMeans(df[, 2:(length(df)-1)] == "Y") > 0.5] <- "Y"

一个很好的功能是,如果添加更多变量,它会增长。

rowMeans(df[, 2:(length(df)-1)] == "X")将为每一行计算具有&#34; X&#34;的元素的比例。您的阈值(3个中的2个)是0.666666 ...我使用0.5代替,因为它对于给定的列数就足够了。如果添加了其他列,则可能会将其增加到2 / 3rds。

答案 1 :(得分:0)

正如Imo指出=用于作业==用于比较。或者是|Here's指向逻辑运算符的链接。

可能有一个更好的解决方案,但这里是您想要做的正确语法:

df$D <- NA
df$D[(df$A == "X" & df$B == "X") | (df$A == "X" & df$C == "X") | 
         (df$B == "X" & df$C == "X")] <- "X"
df$D[(df$A == "Y" & df$B == "Y") | (df$A == "Y" & df$C == "Y") | 
         (df$B == "Y" & df$C == "Y")] <- "Y"
df$D[is.na(df$D)] <- "Z"

答案 2 :(得分:0)

尝试使用ifelse:

 df$D<-ifelse(rowSums(df[,2:4]=='X')>=2,'X',ifelse(rowSums(df[,2:4]=='Y')>=2,'Y','Z'))