2015-05-06 6 views
3

У меня есть dataframe (obs) с 145 строками и более 1000 столбцов плюс числовой вектор с 145 значениями (thr).сумма, если больше, чем в r

Я хотел бы получить еще один вектор (sumifs) с 145 элементами, где каждый элемент является суммой значений obs [n,]> = thr [n].

Я думал, что я мог запустить цикл, где одна сумма строки рассчитывается более или менее, как:

sumifs[n] <- if(obs[n,]>=thr[n],sum(obs[n,])) 

, но я не смог заставить его работать на одной строке либо.

Я рассматривал другие вопросы, где было предложено использовать агрегат или пакет plyr, но я действительно ничего не нашел.

Упрощенный пример только 15 строк и 3 столбцов следующая

c1 <- rep(1:5,3) 
c2 <- rep(3:7,3) 
c3 <- rep(2:6,3) 

obs <- data.frame(r1,r2,r3) 
thr <- c(2,2,3,3,4,4,5,5,2,2,3,3,4,4,5) 

obs 
    r1 r2 r3 
1 1 3 2 
2 2 4 3 
3 3 5 4 
4 4 6 5 
5 5 7 6 
6 1 3 2 
7 2 4 3 
8 3 5 4 
9 4 6 5 
10 5 7 6 
11 1 3 2 
12 2 4 3 
13 3 5 4 
14 4 6 5 
15 5 7 6 

поэтому SUMIFS должно быть:

sumifs 
5 
9 
12 
15 
18 
0 
0 
0 
15 
18 
3 
7 
9 
15 
18 
+1

Просьба представить тестовые данные для входа, см также HTTP: //stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – sgibb

ответ

5
#your data 
DF <- as.data.frame(matrix(1:6, ncol = 2)) 
#turn into matrix 
m <- as.matrix(DF) 

#your threshold 
thr <- c(3, 1, 7) 

#compare 
m >= thr 
#  V1 V2 
#[1,] FALSE TRUE 
#[2,] TRUE TRUE 
#[3,] FALSE FALSE 

#logical values get turned to 0/1 during arithmetics 
#thus we can just multiply the matrix with the comparison 
m * (m >= thr) 
#  V1 V2 
#[1,] 0 4 
#[2,] 2 5 
#[3,] 0 0 

#and calculate the row sums 
rowSums(m * (m >= thr)) 
#[1] 4 7 0 
+0

Он отлично работает! Большое спасибо. – Corrado