我在第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 =”
中的意外'='
这样做的最佳方式是什么?
答案 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'))