【问题标题】:R, conditional summing of every second cell in each rowR,每行中每隔一个单元格的条件求和
【发布时间】:2017-06-13 02:45:31
【问题描述】:

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

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 次。

我想不使用循环,所以我尝试使用sum()which() 就像在Conditional Sum in R 中一样,但找不到通过的方法。

【问题讨论】:

    标签: r sum


    【解决方案1】:

    我们使用回收向量 (c(TRUE, FALSE)) 为交替列的数据集子集,以获取数据集的第 1、3、...等列,通过检查它是否大于 0 将其转换为逻辑向量 ( &gt; 0),然后将值与交替列的第二个子集相乘,即。通过使用回收向量 (c(FALSE, TRUE)),第 2、第 4 列等。这个想法是,如果左列中有小于 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
    

    或者另一个选项是ReduceMap

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

    【讨论】:

    • 这工作正常,但我不明白如何。 * 操作员在做什么?
    • @Joe 是乘法运算符,以便在其他逻辑矩阵中将对应的值转换为 0 为 FALSE
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2021-07-11
    • 2019-05-11
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多