R语言 尝试根据条件将字符变量排序到具有新值的新变量中

c3frrgcw  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(170)

我想排序一个字符变量到两个类别在一个新的变量的基础上的条件,在条件不满足我想它返回“其他”。
如果变量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
6tdlim6h

6tdlim6h1#

下面是正确的case_when语法。

df <- data.frame(x = c("A", "B", "C", "D"))
 
library(dplyr)

df <- df %>%
  mutate(y = case_when(x %in% c("A", "D") ~ 1,
                       x %in% c("B", "C") ~ 0,
                       TRUE ~ NA_real_))
df
#>   x y
#> 1 A 1
#> 2 B 0
#> 3 C 0
#> 4 D 1
f1tvaqid

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,现在只需要使用列xx %in% df看起来像是在测试列x是否在 Dataframe df中,你不需要这样做,而是使用x %in% c("A", "D")。Aron的答案显示了完整正确的语法,我希望这个答案能帮助你理解为什么。

相关问题