在R中对多变量使用cumsum()时的NA值处理问题
解决方法
核心思路
要保留原数据的所有时间行,同时计算连续的累积和,关键是把NA值替换为0(代表该时间点无对应物种个体),再用cumsum()计算,这样得到的累积和变量长度和原数据完全一致,可直接用于线性模型。
具体代码
# 计算Whiting的累积和:将NA替换为0后累加 fish1$run.whit <- cumsum(replace(fish1$Whiting, is.na(fish1$Whiting), 0)) # 计算Cod的累积和:同理处理NA fish1$run.cod <- cumsum(replace(fish1$Cod, is.na(fish1$Cod), 0))
对原有问题的说明
- 子集化数据的方式会丢失原时间行,导致不同物种的累积和变量长度不一致,无法合并回原数据框用于
lm()建模。 - 用
ifelse()把非正值替换为NA的做法会让cumsum()在遇到第一个NA后,后续所有值都变成NA,这是因为cumsum()默认会传递NA值,所以这种方式不可取。
示例结果
处理后的fish1数据如下:
| Time | Whiting | Cod | run.whit | run.cod |
|---|---|---|---|---|
| 12:00 | 1 | 1 | 1 | 1 |
| 12:01 | NA | NA | 1 | 1 |
| 12:02 | 2 | NA | 3 | 1 |
| 12:03 | NA | NA | 3 | 1 |
这样所有变量长度一致,直接可以用于线性模型:
lm(Time ~ run.whit + run.cod, data = fish1)
内容的提问来源于stack exchange,提问作者c_dev
相关产品推荐
相关产品推荐

