r - 基于具有相同名称的数据框中添加列
问题描述
我有以下数据框:
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
最有效的方法是什么?谢谢!
解决方案
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
推荐阅读
- c++ - qgridlayout 添加和删除子布局
- python-3.x - python panads 通过丢失列名进行分组
- css - 在 Chrome 中模拟缩放的 Css
- android - 如何更改默认日期颜色和星期日列颜色?
- python - 如何将从剪贴板粘贴的大文本转换为单个字符串?
- python - 如何获取 multiprocessing.Manager().Queue() 的进程 ID?
- selenium - 有时无法使用 selenium webdriver 在移动铬中获取当前网址
- android - 来电未显示在锁定屏幕上
- javascript - 无法通过在对话框流上下文中保存文档名称来向文档添加多个字段
- java - JList setSelectedValue 不起作用