首页 > 解决方案 > 基于具有相同名称的数据框中添加列

问题描述

我有以下数据框:

df <- data.frame(c(3, 4, 5, 4, 3), c(6, 6, 6, 5, 5), c(1, 1, 1, 1, 1), c(9, 8, 9, 9, 7), c(6, 7, 8, 7, 6), c(0, 1, 2, 1, 1), c(1, 1, 1, 1, 1), c(3, 3, 3, 2, 3), c(5, 5, 5, 5, 4))
colnames(df) <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
> df
  A A A B B B C C C
1 3 6 1 9 6 0 1 3 5
2 4 6 1 8 7 1 1 3 5
3 5 6 1 9 8 2 1 3 5
4 4 5 1 9 7 1 1 2 5
5 3 5 1 7 6 1 1 3 4

我想添加具有相同列名的行并得到以下数据框:

> new_df
   A  B C
1 10 15 9
2 11 16 9
3 12 19 9
4 10 17 8
5  9 14 8

最有效的方法是什么?谢谢!

标签: r

解决方案


1) split.default 将列拆分为数据框列表并应用于rowSums每个。然后转换回data.frame。

as.data.frame(lapply(split.default(df, names(df)), rowSums))

   A  B C
1 10 15 9
2 11 16 9
3 12 19 9
4 10 17 8
5  9 14 8

2) tapply将元素逐列解开成一个向量,并使用tapply对具有相同行号和列名的元素求和。最后转换为数据框。

as.data.frame(tapply(c(unlist(df)), list(c(row(df)), names(df)[col(df)]), sum))

给予:

   A  B C
1 10 15 9
2 11 16 9
3 12 19 9
4 10 17 8
5  9 14 8

3) model.matrix用于model.matrix创建一个矩阵,当预乘时as.matrix(df)给出结果。最后转换为data.frame。

mm <- model.matrix(~ names(df) + 0)
setNames(as.data.frame(as.matrix(df) %*% mm), unique(names(df)))

给予:

   A  B C
1 10 15 9
2 11 16 9
3 12 19 9
4 10 17 8
5  9 14 8

4)按行 创建一个对一行执行求和的函数,然后将其应用于每一行。转换为 data.frame。

collapseRow <- function(x) tapply(x, names(df), FUN = sum)
as.data.frame(t(apply(df, 1, collapseRow)))

给予:

   A  B C
1 10 15 9
2 11 16 9
3 12 19 9
4 10 17 8
5  9 14 8

推荐阅读