使用na.rm = TRUE和mutate中的函数

时间:2015-10-05 21:40:00

标签: r dplyr

我正在尝试计算累积金额并使用mutate创建新列。我正在为多个列执行此操作,并且每个列都在不同位置丢失数据。

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

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

2 个答案:

答案 0 :(得分:5)

您需要为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)

答案 1 :(得分:1)

避免加载plyr的另一个解决方案是使用tidyr::replace_na(请参阅http://tidyr.tidyverse.org/reference/replace_na.html):

library(dplyr)
library(tidyr)

df %>% replace_na(list(water = 0)) %>% mutate(sumwater = cumsum(water))