2013-02-23 4 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

ответ

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'. –

+0

@MatthewLundberg, вы правы! повторное чтение справки 'ifelse', есть предупреждение, которое использует аналогичную конструкцию' (tmp <- yes; tmp [! test] <- no [! test]; tmp) ' – agstudy

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 
Смежные вопросы