使用 mutate 和starts_with

D. *_*der 3 r dplyr

我想根据某些变量是否以某个字符串序列开头来更改它们的值。

例子:

df <- data.frame(var1 = c("12345", "12345", "12345", "23456", "23456"))
df %>% mutate(var2 = ifelse(starts_with("123"), "ok", "not ok"))
Run Code Online (Sandbox Code Playgroud)

所有以“123”开头的值都应更改为“ok”。我怎样才能starts_with()与结合mutate()

谢谢!

akr*_*run 6

我们可以用case_when

library(dplyr)
library(stringr)
df %>% 
  mutate(var2 = case_when(str_detect(var1, '^123') ~ 'ok',
                TRUE ~ 'not ok'))
#   var1   var2
#1 12345     ok
#2 12345     ok
#3 12345     ok
#4 23456 not ok
#5 23456 not ok
Run Code Online (Sandbox Code Playgroud)

或者与ifelsebase R

ifelse(grepl('^123', df$var1), 'ok', 'not ok')
#[1] "ok"     "ok"     "ok"     "not ok" "not ok"
Run Code Online (Sandbox Code Playgroud)

数据

df <- data.frame(var1 = c("12345", "12345", "12345", "23456", "23456"), 
      stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)


Ron*_*hah 5

starts_with用于选择以特定名称开头的列。在这里你可以使用基础RstartsWith代替。

library(dplyr)
df %>% mutate(var2 = ifelse(startsWith(var1, "123"), "ok", "not ok"))

#   var1   var2
#1 12345     ok
#2 12345     ok
#3 12345     ok
#4 23456 not ok
#5 23456 not ok
Run Code Online (Sandbox Code Playgroud)

然而,我们也可以在基础 R 中做到这一点,而无需ifelse.

df$var2 <- c('not ok', 'ok')[startsWith(df$var1, '123') + 1]
Run Code Online (Sandbox Code Playgroud)

或者与grepl

df$var2 <- c('not ok', 'ok')[grepl('^123', df$var1) + 1]
Run Code Online (Sandbox Code Playgroud)

数据

startsWith需要数据为字符,请使用stringsAsFactors = FALSE.

df <- data.frame(var1 = c("12345", "12345", "12345", "23456", "23456"), 
      stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)