如何对 R 中 data.frame 中两个相邻列的值求和,但保持 0 不变?
How to sum values from two adjacent columns in a data.frame in R but keep 0s as such?
我有一个 data.frame,其中包含一组动物的 absence/presence 数据 (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
我想做的是计算每个人每年的年龄,这意味着我想将 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
重要的是,零应该保持为零:一旦在一系列非零值之后有一个带有 0 的列,该值应该再次为 0,因为动物已经死亡并且不会在种群中继续存在。
我浏览了很多Whosebug的问题,例如:
sum adjacent columns for each column in a matrix in R
但是,我找不到在个体去世后进行截断部分的解决方案(生活 4 年后为 0 意味着该动物已经离开种群并且不应再记录年龄那一年)。
提前感谢您的建议! :)
这是一个非常简单的方法。我们逐行求和,然后乘以原始数据帧——乘以 0 将 0 项清零,乘以 1 保持总和项不变。由于您在数字周围加上引号使它们成为 character
class,我们首先将您所有的列转换为 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
我有一个 data.frame,其中包含一组动物的 absence/presence 数据 (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
我想做的是计算每个人每年的年龄,这意味着我想将 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
重要的是,零应该保持为零:一旦在一系列非零值之后有一个带有 0 的列,该值应该再次为 0,因为动物已经死亡并且不会在种群中继续存在。
我浏览了很多Whosebug的问题,例如:
sum adjacent columns for each column in a matrix in R
但是,我找不到在个体去世后进行截断部分的解决方案(生活 4 年后为 0 意味着该动物已经离开种群并且不应再记录年龄那一年)。
提前感谢您的建议! :)
这是一个非常简单的方法。我们逐行求和,然后乘以原始数据帧——乘以 0 将 0 项清零,乘以 1 保持总和项不变。由于您在数字周围加上引号使它们成为 character
class,我们首先将您所有的列转换为 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