r-dplyr::选择across()的语义,选择范围a:n中的列,然后在oner中排除



这是一个数据帧:

mydf <- data.frame(
id = 1:10,
blah = letters[1:10],
x = rnorm(10),
x_st = rnorm(10),
y = rnorm(10),
y_st = rnorm(10),
z = rnorm(10),
z_st = rnorm(10)
)

我想把x,y和z变异成它们的平方。类似于:

# want square just x,y,z
mydf %>% mutate(across(x:z_st, ~ .x^2))

除了这里包括x和z_st之间的所有列之外。我想用英语告诉r"在x和z_st之间突变所有列,但忽略任何包含字符串_st的列"。

我想知道是否有一条优雅的单行线,而不是沿着线路打两个精选电话。也就是说,我想避免类似于mydf %>% select(x:z_st) %>% select_at(vars(!matches('_st')))的事情,也就是说如果可能的话,我想最小化我的代码,少写一个管道命令?

如果列名不在一个范围内(:(,则使用不带引号/带引号的列名的c

library(dplyr)
mydf %>%
mutate(across(c(x, y, z), ~ .x^2))

或者在matches中指定正则表达式模式,通过在字符串的末尾加前缀^(在开头(和后缀($(,仅选择名称为"x"、"y"、"z"的列

mydf %>% 
mutate(across(matches('^[xyz]$'), ~ .^2))

或者另一个选项是使用-从范围x:z_st中删除matches为"_st"的列

mydf %>%
mutate(across(c(x:z_st, -matches('_st')), ~ .^2))

最新更新