R dplyr变异列的滚动总和

时间:2017-08-14 14:01:59

标签: r dplyr cumsum

我有一个data.frame,有几个树木直径的测量值。我试图做的是计算变量dbh_increase的累积和,这是变异操作的产物(希望我在这里很清楚)。

我的data.frame:https://www.dropbox.com/s/9usbu2kubbdyheu/bddendro.csv?dl=0

以下是我正在运行的整个代码:

bddendro<-read.table("bddendro.csv", h=T, sep = ";", dec = ",")
bddendro$dbh_new<-(bddendro$cbh_init + (bddendro$dendro_length * 0.2))/pi

bddendro<- bddendro %>%
  filter(med != 0) %>%
  group_by(parc, tree) %>%
  mutate(dbh_increase = ifelse(dendro_length < lag(dendro_length), 0 ,dbh_new - lag(dbh_new))) %>%
  mutate(dbh_cumsum = cumsum(dbh_increase))

第一个mutate()工作正常,至少在我预期的情况下,第二个不起作用。仅返回NA值

解决方案:

cumsum()不处理NA值,所以我使用mutate()将NAs更改为0,代码如下:

mutate(dbh_increase = ifelse(is.na(dbh_increase), 0, dbh_increase)) 

1 个答案:

答案 0 :(得分:0)

您的第一个mutate()创建了NA值,因为每个(parc,tree)组中的第一行没有滞后(dbh_new)。因此,第二个mutate()中的cumsum()返回所有NAs。

请改为尝试:

bddendro2 <- bddendro %>%
  filter(med != 0) %>%
  group_by(parc, tree) %>%
  arrange(dendro_length) %>%
  mutate(dbh_increase = ifelse(is.na(lag(dbh_new)), 0, dbh_new - lag(dbh_new))) %>%
  mutate(dbh_cumsum = cumsum(dbh_increase)) %>%
  ungroup()