【发布时间】:2017-11-24 17:25:22
【问题描述】:
我正在尝试编写一个函数,该函数需要从结果数据框中排除用户传递的变量。我也借此机会进一步了解新的 dplyr 语法。
该函数的作用类似于数据帧的交叉连接。我想用它作为跨函数参数复制数据的干净方式。
函数的作用如下:
crossjoin_df <- function(df1, df2, temp_col = ".k") {
df1 <- df1 %>%
mutate(!!temp_col := 1)
df2 <- df2 %>%
mutate(!!temp_col := 1)
out <- left_join(df1, df2, by = temp_col)
# I'm trying to replace the next line
out[,!names(out)==temp_col]
}
params <- data.frame(k = c(11,10),
n = c(27,26))
data <- data.frame(a = 1:3,
b = 4:6)
crossjoin_df(params, data) # 6 row data set
我想看看是否可以用管道选择语句替换最后一个语句。但是,否定似乎不起作用。
我可以得到类似的东西:
out %>% select(!!temp_col)
工作,但这显然只选择.k。我无法得到类似的东西:
out %>% select(-!!temp_col)
上班。
【问题讨论】:
-
由于
temp_var是一个字符串,如果你想用!!取消引用,你需要使用rlang::sym把它变成一个quosure,例如out %>% select(-!!rlang::sym(temp_col)) -
谢谢,我的理解是我不能让
temp_var裸露,因为我需要它位于mutate语句的LHS 上。不确定是否有更清洁的方法来解决它。我希望能够只坚持使用 dplyr。