2015-10-05 22 views
2

我想计算累计和并使用mutate来创建新列。我正在为多列进行此操作,并且每个列都在不同的地方缺少数据。使用na.rm = TRUE与变异函数内的函数

day water nitrogen 
1  4  5 
2  NA  6 
3  3  NA 
4  7  NA 
5  2  9 
6  NA  3 
7  2  NA 
8  NA  2 
9  7  NA 
10  4  3 

我尝试

mutate(df, sumwater = cumsum(water))%>% 
mutate(sumnitrogen = cumsum(nitrogen)) 

mutate(df, sumwater = cumsum(water, na.rm = TRUE))%>% 
mutate(sumnitrogen = cumsum(nitrogen, na.rm = TRUE)) 

既不作品。我知道我们可以在summarize函数中做na.rm=TRUE。有没有办法让它在mutate中工作?我更喜欢dplyr的答案,因为实际上这是一条长长的管道系统的一部分。

+1

虽然没有具体的dplyr,很好的答案紧靠'cumsum'和'NA' [这里](http://stackoverflow.com/questions/25576358/calculate-cumsum-while-ignoring-na-值) – aosmith

+1

'cumsum'没有'na.rm'参数,这不是dplyr特有的问题。请参阅'?cumsum'文档。 – Frank

+2

你也可以做类似'df%>%mutate(sumwater = cumsum(replace(water,is.na(water),0)),sumnitrogen = cumsum(replace(nitrogen,is.na(nitrogen),0) ))' –

回答

3

您需要为NA选择重置值。你可以做到零。但是,如果这些都是真的NA的,意思是更换似乎更有意义(甚至是几何平均值,如果值是严格大于0)

detach("package:dplyr") 
library(plyr) 
library(dplyr) 

mutate(df, sumwater = water %>% mapvalues(NA, 0) %>% cumsum) 

mutate(df, sumwater = water %>% mapvalues(NA, mean(water)) %>% cumsum) 
+0

你有plyr下来两次。 – Frank

+0

oops固定。必须确保在dplyr之前加载plyr – bramtayl