如何让switch()函数处理NA值?

4

好的,我需要重新编码一个数据框,因为我希望将因子转换为整数:

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)

这个代码的功能是正常的,但是下一个变量(性别)存在NA值,情况变得复杂了:

df$sex <- sapply(df$sex, switch, "male" = 1, "female" = 2, NA)

返回将 NA 转换为 oblivion 的列表。使用 unlist() 返回的向量对 df 来说太短了。

length(unlist(sapply(df$sex, switch, "male" = 1, "female" = 2, NA)))

应该是 20207,但实际上是 20206

我想要的是一个向量,通过将 NAs 返回为 NAs 来匹配 df。

除了一个可行的解决方案外,如果能解释一下我的错误以及代码的实际工作原理,我会非常感激。

编辑:感谢您所有的回答。像通常情况下一样,我应该自己注意到更有效率的解决方案(嗯,我自己发现了它,但显然太晚了):

>str(df$sex)
Factor w/ 2 levels "male","female": 1 2 1 1 2 1 1 1 1 1 ...

所以我只需使用as.numeric()就可以得到想要的结果。


1
可能不需要循环或开关;尝试 x = c("a", "e", "a", "a", NA, "d", "b", "b", NA, "d"); lu = c( "a"=1, "b"=2, "c"=3, "d"=4, "e"=5); lu[x] - user20650
2个回答

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

数据:

x <- c("a", "e", "a", "a", NA, "d", "b", "b", NA, "d")

2
`NA`是做什么用的? - YOLO
2
@YOLO 你也可以写成"NA"(如果你的x中没有字符"NA"),它将NA识别为另一个级别(就像一个字符"NA"),而"NA"=NA则将NA分配给它。 - jay.sf
2
switch(NA_character_, NA= 1) 的结果是 1,而 switch(NA, NA= 1) 的结果是 NULL。这是因为第一个参数被强制转换为整数而不是字符,这真的不是我预期的结果。 - moodymudskipper

3

如果你有兴趣,还可以使用 dplyr 中的 case_when() 来完成此操作:

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

df <- crash2 %>% dplyr::select(source, sex) %>% 
  mutate(source = case_when(
    source == "telephone"~1, 
    source == "telephone entered manually"~2, 
    source == "electronic CRF by email"~3, 
    source == "paper CRF enteredd in electronic CRF"~4, 
    source == "electronic CRF"~5), 
    sex = case_when(
      sex == "male" ~ 1, 
      sex == "female" ~ 2))

table(df$sex, useNA="ifany")
#     1     2  <NA> 
# 16935  3271     1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接