【发布时间】:2013-02-09 06:15:52
【问题描述】:
这是对我之前的question 的更复杂的后续。答案是使用矩阵,但这不适用于具有不同模式值的数据帧。
我想将不同大小的数据框与字符列和整数列组合起来,并根据多个条件计算它们的总和。
条件
- 只为那些具有匹配“名称”值的行计算总和
- 仅针对匹配的列名计算总和
- 如果
df4中的单元格不为0且不为NA,则总和应为df3 + df4 - 否则总和应该是
df1 + df2 + df3
示例
> df1 <- data.frame(Name=c("Joe","Ann","Lee","Dan"), "1"=c(0,1,5,2), "2"=c(3,1,0,0), "3"=c(2,0,2,2), "4"=c(2,1,3,4))
> df1
Name X1 X2 X3 X4
1 Joe 0 3 2 2
2 Ann 1 1 0 1
3 Lee 5 0 2 3
4 Dan 2 0 2 4
> df2 <- data.frame(Name=c("Joe","Ann","Ken"), "1"=c(3,4,1), "2"=c(2,3,0), "3"=c(2,4,3))
> df2
Name X1 X2 X3
1 Joe 3 2 2
2 Ann 4 3 4
3 Ken 1 0 3
> df3 <- data.frame(Name=c("Lee","Ben"), "1"=c(1,3), "2"=c(3,4), "3"=c(4,3))
> df3
Name X1 X2 X3
1 Lee 1 3 4
2 Ben 3 4 3
条件取决于这个框架:
> df4 <- data.frame(Name=c("Lee","Ann","Dan"), "1"=c(6,0,NA), "2"=c(0,0,4), "3"=c(0,NA,0))
> df4
Name X1 X2 X3
1 Lee 6 0 0
2 Ann 0 0 NA
3 Dan NA 4 0
对于上述示例,这是预期的结果(* 值取决于 df4):
> dfsum
Name X1 X2 X3 X4
1 Joe 3 5 4 2
2 Ann 5 4 4 1
3 Lee 7* 3 6 3
4 Dan 2 4* 2 4
5 Ken 1 0 3 NA
6 Ben 3 4 3 NA
可能的步骤?
先将df1、df2、df3、df4扩展为5列6行,用NA填充缺失数据。
那么对于每个数据框:
- 按“名称”对行进行排序
- 将“名称”列与“X1”...“X4”分开
- 将“X1”...“X4”列转换为矩阵
- 计算矩阵的总和,就像我的另一个问题的答案一样但有附加条件 1
- 将结果矩阵转换为数据框
- 将“名称”列与结果数据框绑定
如何在 R 中做到这一点?
解决方案
@Ricardo Saporta 的解决方案只需稍加改动即可工作:
在四个 addCols() 中添加, padValue=NA)。
如回答here,将 sumD3D4 和 dtsum 的定义替换为:
plus <- function(x) {
if(all(is.na(x))){
c(x[0],NA)} else {
sum(x,na.rm = TRUE)}
}
sumD3D4 <- setkey(rbind(dt3, dt4)[,lapply(.SD, plus), by = Name], "Name")
dtsum <- setkey(rbind(dt1, dt2, dt3)[, lapply(.SD, plus), by=Name], "Name")
【问题讨论】:
-
看来
characters 的唯一作用是名称。那是对的吗 ?如果是这样,您仍然可以使用推荐的矩阵方法并将字符串应用于rownames(mtrx) -
另外,关于不同的列数,是否可以添加虚拟列以填充 0 以使所有 df 的宽度相同?
-
它们应该是NA,但是在计算两个矩阵之和时是否可以将NA视为0?