R 更改和/或汇总动态列数
在上一个问题中,我想在具有动态案例数量时执行R 更改和/或汇总动态列数,r,dplyr,rlang,R,Dplyr,Rlang,在上一个问题中,我想在具有动态案例数量时执行案例。解决方案是使用parse_exprs和。我正在寻找一个类似的解决方案,用动态的列数进行变异/总结 考虑以下数据集 库(dplyr) 图书馆(rlang) 数据(mtcars) mtcars=mtcars%>% 突变(g2=ifelse(档位=2,1,0), g3=ifelse(档位==3,1,0), g4=ifelse(档位=4,1,0)) 假设我想对列g2,g3,g4求和。如果我知道这些是列名称,那么这就是简单的标准dplyr: answer
案例。解决方案是使用parse_exprs
和代码>。我正在寻找一个类似的解决方案,用动态的列数进行变异/总结
考虑以下数据集
库(dplyr)
图书馆(rlang)
数据(mtcars)
mtcars=mtcars%>%
突变(g2=ifelse(档位=2,1,0),
g3=ifelse(档位==3,1,0),
g4=ifelse(档位=4,1,0))
假设我想对列g2
,g3
,g4
求和。如果我知道这些是列名称,那么这就是简单的标准dplyr:
answer=mtcars%>%
总结(sum_g2=sum(g2),
sum_g3=sum(g3),
sum_g4=sum(g4))
但是假设我不知道有多少列,或者它们的确切名称。相反,我有一个包含我关心的所有列名的向量。按照我先前方法的公认答案中的逻辑,我将使用:
columns\u to\u sum=c(“g2”、“g3”、“g4”)
公式=paste0(“求和”,列“求和到”列“=sum”(“列“求和到”)列)
答案=mtcars%>%
总结(!!!解析表达式(公式))
如果这确实有效,那么无论在columns\u to\u sum
中作为输入提供的列名是什么,我都应该收到相应列的总和。然而,这是行不通的。我得到了一个名为“sum\u g2=sum(g2)”的列,而不是一个名为sum\u g2
的列,该列中的每个值都是零
考虑到我可以在
时将公式传递到case_,我似乎应该能够将公式传递到summary
(同样的想法也适用于mutate
,因为它们都使用rlang包)
过去有mutate
和summary
(mutate
和summary
)的字符串版本,您可以将公式作为字符串传递给它们。但是,由于rlang方法现在是预期的方法,因此这些方法已经失效。我在Stackoverflow上审查的相关问题没有使用rlang报价方法,因此不足以满足我的目的
如何使用动态列数(使用rlang方法)进行总结?您的尝试给出了正确答案,但没有给出预期的列名
下面是一种使用map
获得正确名称的方法:
library(dplyr)
library(rlang)
library(purrr)
map_dfc(columns_to_sum, ~mtcars %>%
summarise(!!paste0('sum_', .x) := sum(!!sym(.x))))
# sum_g2 sum_g3 sum_g4
#1 0 15 12
您也可以使用这种简单的base R方法,而不需要任何NSE材料:
setNames(data.frame(t(colSums(mtcars[columns_to_sum]))),
paste0('sum_', columns_to_sum))
以dplyr
的方式:
mtcars %>%
summarise(across(all_of(columns_to_sum), sum)) %>%
set_names(paste0('sum_', columns_to_sum))
自dplyr 1.0.0以来的一个选项可以是:
mtcars %>%
summarise(across(all_of(columns_to_sum), sum, .names = "sum_{col}"))
sum_g2 sum_g3 sum_g4
1 0 15 12
这也适用于不在列\u to \u sum
中的其他变量,例如:summary(num=n(),横跨(all_of(cols),sum,.names=“sum”{cols}”)
。但请注意。names=cols
会产生错误。输出列需要与输入列不同的名称。