我有一个数据帧,并希望每一行的每个第二个单元格(从第二个单元格开始)的总和,其左邻居大于零。这是一个例子:
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()
进行了尝试,但无法找到方法。
答案 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