我将如何按具有等效前缀的列进行分组并对它们求和?

How would I group by columns with equivalent prefix and sum them?

假设我有这个数据框:

> df <- data.frame(a1=c(1, 2, 3, 4, 5), b1=c(5, 4, 3, 2, 1), b2=c(10, 11, 12, 13, 14), a2=c(5, 6, 7, 8, 9), c1=c(100, 200, 300, 400, 500))
> df
  a1 b1 b2 a2  c1
1  1  5 10  5 100
2  2  4 11  6 200
3  3  3 12  7 300
4  4  2 13  8 400
5  5  1 14  9 500
> 

如您所见,我有列 a1 a2 都以 a 开头,我想按行对它们求和并只生成 [=16] 的一列=],与第 b 列相同。同样对于 c 列,只有 c 列应该保持原样,因为只有一列以 c.

开头

期望的输出:

    a   b    c
1   6  15  100
2   8  15  200
3  10  15  300
4  12  15  400
5  14  15  500

来自 Python,在 (Python 库)中,我可以简单地使用:

df.groupby(df.columns.str[:1], axis=1).sum()

但我不确定如何在 R 中执行此操作。

我试过了dplyr:

df %>% group_by(sub(".$", "", colnames(df))) %>%
  mutate(across(colnames(.), sum))

但是出现错误。 R 新手

as.data.frame(lapply(unique(sapply(names(df), function(x) grep(substr(x,1,1), names(df)))), function(y) if(is.na(y[2])) df[[y[1]]] else df[[y[1]]] + df[[y[2]]]))
  c.6..8..10..12..14. c.15..15..15..15..15. c.100..200..300..400..500.
1                   6                    15                        100
2                   8                    15                        200
3                  10                    15                        300
4                  12                    15                        400
5                  14                    15                        500

然后您可以使用以下方式设置名称:

unique(substr(names(df),1,1))
[1] "a" "b" "c"

如评论:

sapply(unique(sub(".$", "", colnames(df))), function(x) rowSums(df[startsWith(colnames(df), x)]))