我将如何按具有等效前缀的列进行分组并对它们求和?
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,在 pandas(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)]))
假设我有这个数据框:
> 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,在 pandas(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)]))