Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 更改和/或汇总动态列数_R_Dplyr_Rlang - Fatal编程技术网

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
会产生错误。输出列需要与输入列不同的名称。