我想排序一个字符变量到两个类别在一个新的变量的基础上的条件,在条件不满足我想它返回“其他”。
如果变量x包含4个字符值“A”、“B”、“C”和“D”,我想将它们分为2类,1和0,在一个新变量y中,创建一个虚拟变量
理想情况下,我希望它看起来像这样
df <- data.frame(x = c("A", "B", "C" & "D")
y <- if x == "A" | "D" then assign 1 in y
if x == "B" | "C" then assign 0 in y
if x == other then assign NA in y
x y
1 "A" 1
2 "B" 0
3 "C" 0
4 "D" 1
library(dplyr)
df <- df %>% mutate ( y =case_when(
(x %in% df == "A" | "D") ~ 1 ,
(x %in% df == "B" | "C") ~ 1,
x %in% df == ~ NA
))
我收到此错误消息
Error: replacement has 3 rows, data has 2
2条答案
按热度按时间6tdlim6h1#
下面是正确的
case_when
语法。f1tvaqid2#
你用一种在语言中有意义而在代码中没有意义的方式来组合语法。通常你不能使用
foo == "G" | "H"
。你需要使用foo == "G" | foo == "H"
,或者方便的简写foo %in% c("G", "H")
。类似地,
x %in% df == "A"
没有意义,x %in% df
有意义,df == "A"
有意义,把它们放在一起,对R来说没有意义。(好吧,这对R来说是有意义的,但对你来说意义不一样。R会使用它的运算顺序,首先计算x %in% df
,然后从中得到result
,然后检查result == "A"
是否是您想要的。)在
mutate
这样的dplyr
函数中,不需要一直指定df
。您通过管道输入df
,现在只需要使用列x
。x %in% df
看起来像是在测试列x
是否在 Dataframedf
中,你不需要这样做,而是使用x %in% c("A", "D")
。Aron的答案显示了完整正确的语法,我希望这个答案能帮助你理解为什么。