R,每行中每第二个单元的条件求和

时间:2017-01-27 12:06:58

标签: r sum which

我有一个数据帧,并希望每一行的每个第二个单元格(从第二个单元格开始)的总和,其左邻居大于零。这是一个例子:

a <- c(-2,1,1,-2)
b <- c(1,2,3,4)
c <- c(-2,1,-1,2)
d <- c(5,6,7,8)
df <- data.frame(a,b,c,d)

这给出了:

> df
   a b  c d
1 -2 1 -2 5
2  1 2  1 6
3  1 3 -1 7
4 -2 4  2 8

对于第一行,正确的和为0(1的左邻居为-2,左邻居为5也为-2);对于第二个它的8;对于第三个它的3;对于第四个它又是8.

我想在没有循环的情况下执行此操作,因此我在Conditional Sum in R中使用sum()which()进行了尝试,但无法找到方法。

1 个答案:

答案 0 :(得分:2)

我们使用回收矢量(c(TRUE, FALSE))对交替列的数据集进行子集化,以获取数据集的第1,第3,...等列,通过检查它是否大于数据集将其转换为逻辑向量0(> 0),然后将值与第二个交替列子集相乘,即。第2列,第4列等使用回收矢量(c(FALSE, TRUE))。我们的想法是,如果左列中的值小于0,则逻辑矩阵中的值将为FALSE,并且通过与其他子集相乘将其强制为0。最后,执行rowSums以获得预期的输出

rowSums((df[c(TRUE, FALSE)]>0)*df[c(FALSE, TRUE)])
#[1] 0 8 3 8

它也可以替换为seq

rowSums((df[seq(1, ncol(df), by = 2)]>0)*df[seq(2, ncol(df), by = 2)])
#[1] 0 8 3 8

或另一个选项Reduce Map

Reduce(`+`, Map(`*`, lapply(df[c(TRUE, FALSE)], `>`, 0), df[c(FALSE, TRUE)]))
#[1] 0 8 3 8