【问题标题】:Conditional sum of data frames in RR中数据帧的条件总和
【发布时间】:2013-02-09 02:41:55
【问题描述】:

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

对于下面的示例,如果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 中做到这一点?

【问题讨论】:

  • 你应该使用矩阵而不是 data.frames。

标签: r dataframe


【解决方案1】:
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

【讨论】:

  • @MatthewLundberg 你是对的!重新阅读ifelse 帮助,有一个警告,它使用了类似的构造(tmp &lt;- yes; tmp[!test] &lt;- no[!test]; tmp)
【解决方案2】:

使用@Roland 的定义:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2019-02-24
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2019-03-14
    相关资源
    最近更新 更多