gpt4 book ai didi

r - 按组对名称以模式开头的所有列求和

转载 作者:行者123 更新时间:2023-12-04 11:36:17 25 4
gpt4 key购买 nike

我对 R 相当陌生,我正在尝试根据他们的名字按组对列进行求和。我有一个像这样的数据框:

DT <- data.frame(a011=c(0,10,20,0),a012=c(010,10,0,0),a013=c(10,30,0,10),
a021=c(10,20,20,10),a022=c(0,0,0,10),a023=c(20,0,0,0),a031=c(30,0,10,0),
a032=c(0,0,10,0),a033=c(20,0,0,0))

我想获得以“a01”开头的所有列、以“a02”开头的所有列和以“a03”开头的所有列的总和:
a01tot a02tot a03tot
20 30 50
50 20 0
20 20 20
10 20 0

到目前为止,我已经使用
DT$a01tot <- rowSums(DT[,grep("a01", names(DT))])

依此类推,但我的真实数据框有更多组,我想避免为每个组编写一行代码。我想知道是否可以在向量或列表中包含“a01”、“a02”、“a03”... 并添加一些“a01tot”、“a02tot”、“a03tot”...自动生成数据框。

我知道我的问题与这个问题非常相似: R sum of rows for different group of columns that start with similar string ,但解决方案在那里指出,
cbind(df, t(rowsum(t(df), sub("_.*", "_t", names(df)))))

在我的情况下不起作用,因为没有要替换的通用元素(例如“_”)(我无法将变量的名称更改为 a01_1、a02_2 等)。

在我的情况下,切换到“长”格式也不是一个可行的解决方案。

任何帮助将不胜感激。

最佳答案

另一种可能的解决方案

library(dplyr)
library(reshape2)
library(tidyr)

DT %>%
mutate(id = 1:n()) %>%
melt(id.vars = c('id')) %>%
mutate(Group = substr(variable, 1, 3)) %>%
group_by(id, Group) %>%
summarise(tot = sum(value)) %>%
spread(Group, tot) %>%
select(-id)

结果
Source: local data frame [4 x 3]

a01 a02 a03
1 20 30 50
2 50 20 0
3 20 20 20
4 10 20 0

然后正如@Jota 建议的 colnames(new) <- paste0(colnames(new), "tot")

关于r - 按组对名称以模式开头的所有列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com