2017-08-14 67 views
1

我有一个data.frame与几个树木直径的测量。我想要做的是计算变量dbh_increase的累积和,这是变异操作的产物(希望我已经清楚了)。R dplyr突变柱的滚动总和

我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)) 

第一个发生变异()正常工作,至少我希望,第二个那是行不通的。回到刚刚NA值

SOLUTION:

cumsum()不处理NA值,所以我用了发生变异()来改变的NA为0,代码如下:

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

我不知道你实际上问过一个问题在这里。请务必在样本输入数据中包含[可重现的示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以便我们可以运行和测试代码我们自己。 – MrFlick

+5

你已经用'parc'和'tree'分组(从你发布的数据看来)。这些组合只有一个观察。 “滞后”只在每个分组内计算,因此变成“NA”(以前没有观察到1组)。 – Axeman

+0

我会用你询问的信息编辑我的帖子 –

回答

0

你的第一个发生变异()创建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() 
+0

非常感谢你,像魅力一样工作。仍然试图理解为什么is.na(lag(dbh_new))与“dendro_length

+0

事实上,我做了一个更详细的测试,并没有像我期望的那样工作。做了一些改变,现在它似乎在工作。在我的原始代码中添加一个新行,将dbh_increase NA的值变为0,完成了这项工作 –