我有一个数据框,我将求和相邻的值,直到每一列都为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
答案 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)