2013-02-23 98 views
3

我想合并数据帧并根据其中一个数据帧的值有条件地计算它们的总和。R中数据帧的条件总和

对于以下示例,如果df4中的某个单元格不是0,也不是NA,则该总和应为df3 + df4,否则该总和应为df1 + df2 + df3

> df1 
    1 2 3 
A 0 3 2 
B 1 1 0 
C 5 0 2 

> df2 
    1 2 3 
A 3 2 2 
B 4 3 4 
C 1 0 3 

> df3 
    1 2 3 
A 1 3 4 
B 3 4 3 
C 1 2 3 

的条件取决于该帧上:

> df4 
    1 2 3 
A 6 0 0 
B 0 0 NA 
C NA 4 0 

利用上述实施例中,这是预期的结果:

> dfsum 
    1 2 3 
A 7 8 8 
B 8 8 7 
C 7 6 8 

如何R中这样做呢?

+2

您应该使用矩阵,而不是data.frames这一点。 – Roland 2013-02-23 15:08:10

回答

5
m1 <- matrix(c(0,1,5,3,1,0,2,0,2),3) 
m2 <- matrix(c(3,4,1,2,3,0,2,4,3),3) 
m3 <- matrix(c(1,3,1,3,4,2,4,3,3),3) 
m4 <- matrix(c(6,0,NA,0,0,4,0,NA,0),3) 

msum <- m3 + m4 
temp <- m1 + m2 + m3 
cond <- is.na(m4) | m4==0 

msum[cond] <- temp[cond] 

#  [,1] [,2] [,3] 
#[1,] 7 8 8 
#[2,] 8 8 7 
#[3,] 7 6 8 
+0

@agstudy'ifelse'也一样。 – 2013-02-23 15:54:30

+0

@MatthewLundberg你是对的!重新阅读'ifelse'帮助,有一个警告使用类似的结构'(tmp < - 是; tmp [!test] < - no [!test]; tmp)' – agstudy 2013-02-23 16:13:11

4

使用@罗兰的定义:

ifelse(is.na(m4) | m4==0, m1+m2+m3, m3+m4) 
##  [,1] [,2] [,3] 
## [1,] 7 8 8 
## [2,] 8 8 7 
## [3,] 7 6 8