我有以下数据框:
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
最有效的方法是什么?谢谢!
答案 0 :(得分:1)
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
对具有相同行号和列名的元素求和。最后转换为数据框。
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