如何对 R 中 data.frame 中两个相邻列的值求和但保留 0?

not*_*cta 1 r sum calculated-columns

我有一个 data.frame,其中包含一组动物的缺席/存在数据 (0/1),列为年份,行为个体。

我的数据:

df <- data.frame(Year1 = c('1','0','0','0','0','0'),
                 Year2 = c('1','1','1','0','0','0'),
                 Year3 = c('1','1','1','1','1','0'),
                 Year4 = c('0','1','1','1','1','1'),
                 Year5 = c('0','0','1','1','1','1'),
                 Year6 = c('0','0','0','0','0','0'))

df
     Year1 Year2 Year3 Year4 Year5 Year6
1:     1     1     1     0     0     0
2:     0     1     1     1     0     0
3:     0     1     1     1     1     0
4:     0     0     1     1     1     0
5:     0     0     1     1     1     0
6:     0     0     0     1     1     0

Run Code Online (Sandbox Code Playgroud)

我想做的是计算每个人每年的年龄,这意味着我想将 col1 添加到 col2,然后将总和添加到 col3,依此类推,以便上面的数据框变为:

df
     Year1 Year2 Year3 Year4 Year5 Year6
1:     1     2     3     0     0     0
2:     0     1     2     3     0     0
3:     0     1     2     3     4     0
4:     0     0     1     2     3     0
5:     0     0     1     2     3     0
6:     0     0     0     1     2     0
Run Code Online (Sandbox Code Playgroud)

重要的是,零应该保持为零:一旦在一系列非零值之后有一列带有 0,该值应该再次为 0,因为动物已经死亡并且不会在种群中继续存在。

我浏览了很多 stackoverflow 问题,例如:

R 矩阵中每列的相邻列之和

然而,我找不到在个体去世后执行截止部分的解决方案(4年后的0意味着该动物已经离开种群,并且不应再记录该年的年龄)。

预先感谢您的建议!:)

Gre*_*gor 5

这是一个非常简单的方法。我们按行进行累积和,并乘以原始数据帧 - 乘以 0 将 0 个条目清零,乘以 1 保持求和条目不变。由于您的数字周围有引号character,因此我们首先将所有列转换为numeric

df[] = lapply(df, as.numeric)
result = t(apply(df, 1, cumsum)) * df
result
#   Year1 Year2 Year3 Year4 Year5 Year6
# 1     1     2     3     0     0     0
# 2     0     1     2     3     0     0
# 3     0     1     2     3     4     0
# 4     0     0     1     2     3     0
# 5     0     0     1     2     3     0
# 6     0     0     0     1     2     0
Run Code Online (Sandbox Code Playgroud)