2017-08-14 64 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,完成了這項工作 –