我想根据某些变量是否以某个字符串序列开头来更改它们的值。
例子:
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()?
谢谢!
我们可以用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)
或者与ifelse在base 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)
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)