如何将r中同一组的多个变量的值相加

Posted

技术标签:

【中文标题】如何将r中同一组的多个变量的值相加【英文标题】:how to sum the value for multiple variables by the same group in r 【发布时间】:2022-01-18 00:26:25 【问题描述】:

我需要对同一组中大约 40 个变量的值求和。

这是一个示例数据集。所以我想按地区和部门对 score1-score5 的值求和。

region <- rep(c("south", "east", "west", "north"),times=10)
department <- rep(c("A",  "B","C","D","E"),times=8)
score1 <- rnorm(n = 40, mean = 0, sd = 1)
score2 <-rnorm(n = 40, mean = 3, sd = 1.5)
score3 <-rnorm(n = 40, mean = 2, sd = 1)
score4 <-rnorm(n = 40, mean = 1, sd = 1.5)
score5 <-rnorm(n = 40, mean = 5, sd = 1.5)
df <- data.frame(region, department, score1, score2, score3, score4, score5)

这是导致我想要的结果的代码,但有没有更简单的方法来做到这一点:

df %>% group_by(region, department) %>%
       summarise(score1=sum(score1), 
                score2=sum(score2),
                score3=sum(score3),
                score4=sum(score4),
                score5=sum(score5))

我尝试使用循环,但这不起作用:

vlist<-c("score1", "score2", "score3", "score4", "score5")
for (var in vlist) 
  df<-df %>% group_by(region, department) %>%
    summarise(var=sum(.[[var]]))

还有其他方法或我的循环有什么问题吗? 谢谢!

【问题讨论】:

【参考方案1】:

使用across - 循环across starts_with 'score' 的列并获取sum

library(dplyr)
out1 <- df %>% 
   group_by(region, department) %>% 
   summarise(across(starts_with('score'), sum), .groups = 'drop')

for 循环中,问题在于df 在每次迭代中都会更新(df &lt;-..),summarise返回 group by 中提供的列和总结输出。因此,在第一次迭代之后,'df' 根本就没有'score' 列。如果我们想使用for 循环,请在list 中获取输出,然后在reduce 中使用连接

library(purrr) 
out_list <- vector('list', length(vlist))
names(out_list) <- vlist
for (var in vlist) 
    out_list[[var]] <- df %>% 
            group_by(region, department) %>%
            summarise(!!var := sum(cur_data()[[var]]), .groups = 'drop')
   
out2 <- reduce(out_list, full_join, by = c('region', 'department'))

-检查输出

> identical(out1, out2)
[1] TRUE

【讨论】:

非常感谢。这超级有用! 我还有一个问题。当使用cross按组求和时,如何让r忽略NA?我尝试使用以下代码,但它不起作用。 summarise(across(starts_with('score'), sum(., na.rm=TRUE)), .groups = 'drop') @llxx2021 你可以选择summarise(across(starts_with('score'), sum, na.rm = TRUE), .groups = 'drop')summarise(across(starts_with('score'), ~ sum(., na.rm = TRUE)), .groups = 'drop') 知道了。谢谢!

以上是关于如何将r中同一组的多个变量的值相加的主要内容,如果未能解决你的问题,请参考以下文章

按数组中的多个属性对对象进行分组,然后将它们的值相加

每次python中的秒表达到8的倍数(8、16、24、32等...)时,如何使变量的值相加

将多个用户购买的所有商品的价格相加并将其存储到变量中

将每个组的第一个元素和 RunningValue 相加

在 Visual C++ 中使用 MessageBoxW 输出多个相加的字符串

java中2个或多个数字变量直接相乘相加减运算