我想使用dplyr >= 0.7移除列向量。
library(dplyr)
data(mtcars)
rem_cols <- c("wt", "qsec", "vs", "am", "gear", "carb")
head(select(mtcars, !!paste0("-", rem_cols)))错误:字符串必须与列名匹配。未知列:-wt、-qsec、-vs、-am、-gear、-carb
dplyr < 0.7工作如下:
head(select_(mtcars, .dots = paste0("-", rem_cols)))
# mpg cyl disp hp drat
# Mazda RX4 21.0 6 160 110 3.90
# Mazda RX4 Wag 21.0 6 160 110 3.90
# Datsun 710 22.8 4 108 93 3.85
# Hornet 4 Drive 21.4 6 258 110 3.08
# Hornet Sportabout 18.7 8 360 175 3.15
# Valiant 18.1 6 225 105 2.76我试过所有的组合:syms(),!,!,我能想到的现状和现状……救命!?
发布于 2017-07-14 10:28:22
我们可以使用one_of
mtcars %>%
select(-one_of(rem_cols))发布于 2017-07-17 13:37:42
在这种情况下,我也会使用one_of(),但更一般的情况下,您必须创建以符号作为参数的对-的调用。
# This creates a single call:
call("-", quote(a))
# This creates a list of calls:
syms(letters) %>% map(function(sym) call("-", sym))然后,可以将调用列表与!!!连接起来。
发布于 2018-06-24 00:25:51
我很难精确地完成这个任务,这导致我编写了一个包,friendlyeval,以简化整洁的package。这里有一个关于如何使用这个方法的想法:
library(friendlyeval)
library(dplyr)
data(mtcars)
rem_cols <- c("wt", "qsec", "vs", "am", "gear", "carb")
minus_cols <- paste0("-",rem_cols)
# [1] "-wt" "-qsec" "-vs" "-am" "-gear" "-carb"
head(select(mtcars, !!!friendlyeval::treat_strings_as_exprs(minus_cols)))
# mpg cyl disp hp drat
# Mazda RX4 21.0 6 160 110 3.90
# Mazda RX4 Wag 21.0 6 160 110 3.90
# Datsun 710 22.8 4 108 93 3.85
# Hornet 4 Drive 21.4 6 258 110 3.08
# Hornet Sportabout 18.7 8 360 175 3.15
# Valiant 18.1 6 225 105 2.76这里的一个陷阱是您必须使用treat_strings_as_exprs()而不是treat_strings_as_cols(),因为"-wt“是一个包含列名的表达式,而不是实际的列名。
https://stackoverflow.com/questions/45100518
复制相似问题