好的,我必须重新编码 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()用来得到我想要的。
您可以使用`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)