如何只对每列的相邻值求和,直到为0?

时间:2019-06-07 10:13:46

标签: python r

我有一个数据框,我将求和相邻的值,直到每一列都为0。输出应显示每一列的最大可实现值。

数据框应如下所示:

    A B C D
X1  0 1 0 1
X2  1 0 1 1
X3  0 1 1 1
X4  1 1 1 1
SUM 1 2 3 4

1 个答案:

答案 0 :(得分:0)

1)我们假设:

  • 输入由问题中的示例输入所建议的0和1的数据帧组成。 (对于示例,我们使用在末尾的注释中可重复显示的数据框。)

  • 我们想要最长的1的长度

  • 如果一列中没有1,则该列的总和应为0。如果我们知道所有列都至少有一个1,但在此不做此假设,则可以稍微简化该解决方案。

我们使用以下代码。不使用任何软件包。

sum1 <- function(x) with(rle(x), max(lengths[values == 1], 0))
apply(DF, 2, sum1)
##     A B C D 
##     1 2 3 4 

有关计算行程长度的更多信息,请参见?rle

2)在这里,我们不假定数据帧仅由0和1组成。对于每个非零范围,我们将它们求和并返回最大和。这将使用data.table包的rleid

library(data.table)

sum2 <- function(x) max(tapply(x, rleid(x != 0), sum))
apply(DF, 2, sum2)
##     A B C D 
##     1 2 3 4 

注意

以可重复形式显示的输入DF假定为:

Lines <- "    A B C D
X1  0 1 0 1
X2  1 0 1 1
X3  0 1 1 1
X4  1 1 1 1"
DF <- read.table(text = Lines)