如何将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 <-..
),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等...)时,如何使变量的值相加