如何让 switch() 处理 NA?

Mar*_*kus 4 r sapply

好的,我必须重新编码 df,因为我希望因子为整数:

library(dplyr)

load(url('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/crash2.rda'))

df <- crash2 %>% select(source, sex)

df$source <- sapply(df$source, switch, "telephone" = 1, "telephone entered manually" = 2, "electronic CRF by email" = 3, "paper CRF enteredd in electronic CRF" = 4, "electronic CRF" = 5, NA)
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但下一个变量(性别)中有 NA 并且事情变得复杂:

df$sex <- sapply(df$sex, switch, "male" = 1, "female" = 2, NA)
Run Code Online (Sandbox Code Playgroud)

返回一个 NA 切换到遗忘的列表。使用unlist()返回一个对于 df 来说太短的向量。

length(unlist(sapply(df$sex, switch, "male" = 1, "female" = 2, NA)))
Run Code Online (Sandbox Code Playgroud)

应该是20207,但是是20206

我想要的是通过将 NA 作为 NA 返回来匹配 df 的向量。

除了一个有效的解决方案,我会特别感谢我对我出错的地方以及代码实际工作方式的解释。

编辑:感谢您的所有回答。通常情况下,有一个更有效的解决方案我应该注意到自己(好吧,我自己注意到了,但显然为时已晚):

>str(df$sex)
Factor w/ 2 levels "male","female": 1 2 1 1 2 1 1 1 1 1 ...
Run Code Online (Sandbox Code Playgroud)

所以我可以as.numeric()用来得到我想要的。

jay*_*.sf 5

您可以使用`NA`.

x
# [1] "a" "e" "a" "a" NA  "d" "b" "b" NA  "d"
unname(sapply(x, switch, "a"=1, "b"=2, "c"=3, "d"=4, "e"=5, `NA`=NA))
# [1]  1  5  1  1 NA  4  2  2 NA  4
Run Code Online (Sandbox Code Playgroud)

数据:

x <- c("a", "e", "a", "a", NA, "d", "b", "b", NA, "d")
Run Code Online (Sandbox Code Playgroud)

  • ````NA``` 在做什么? (2认同)
  • @YOLO你也可以写“NA”(不过,如果你有“NA”作为“x”中的字符,则不会),它将“NA”标识为另一个级别(就像字符“NA”)并且`"NA"=NA` 将 `NA` 分配给它。 (2认同)
  • `switch(NA_character_, `NA`= 1)` 是 `1` ,而 `switch(NA, `NA`= 1)` 是 `NULL`,因为第一个参数不是强制为字符而是整数,实际上不是我所期望的。 (2认同)