使用 case_when 和startsWith 有选择地按行进行变异

pgc*_*ahy 2 r dplyr

我正在尝试基于另一列创建一个新列,用于case_when根据每行的值给出不同的输出。

我从df <- data.frame(a=c("abc", "123", "abc", "123"))

b并想像这样生成一个新列

#>     a      b
#> 1 abc letter
#> 2 123 number
#> 3 abc letter
#> 4 123 number
Run Code Online (Sandbox Code Playgroud)

我已经尝试过df %>% mutate(b = case_when(startsWith(a, "a") ~ "letter", startsWith(a, "1") ~ "number")),但它只给出了一个错误。有人可以告诉我如何根据 a 列中行的第一个字母获取 b 列的不同值吗?

akr*_*run 6

根据?startsWith

\n\n
\n

x - 考虑 \xe2\x80\x9cstarts\xe2\x80\x9d 的字符串向量。

\n
\n\n

所以,startsWith期望上课character,现在就是factor上课。将其转换为character类即可解决问题

\n\n
library(dplyr)\ndf %>%\n      mutate(b = case_when(startsWith(as.character(a), "a") ~ "letter",\n                 TRUE ~ "number"))\n#    a      b\n#1 abc letter\n#2 123 number\n#3 abc letter\n#4 123 number\n
Run Code Online (Sandbox Code Playgroud)\n\n

的默认行为data.framestringsAsFactors = TRUE. 如果我们指定stringsAsFactors = FALSE,\'a\' 列将是character

\n\n
\n\n

另一种选择是str_detect通过检查字符串开头 ( ^) 的字符是否为数字 ( [0-9])来创建逻辑表达式

\n\n
library(stringr)\nlibrary(dplyr)\ndf %>% \n    mutate(b = c("letter", "number")[1+str_detect(a, "^[0-9]")])\n#    a      b\n#1 abc letter\n#2 123 number\n#3 abc letter\n# 123 number\n
Run Code Online (Sandbox Code Playgroud)\n