使用dplyr中的group_by和na.locf函数

8
我正在尝试使用zoo包中的na.locf函数来处理使用dplyr分组的数据。我正在使用此问题的第一个解决方案:使用dplyr窗口函数使后续值填充NA值
library(dplyr);library(zoo)
df1 <- data.frame(id=rep(c("A","B"),each=3),problem=c(1,NA,2,NA,NA,NA),ok=c(NA,3,4,5,6,NA))
df1
  id problem ok
1  A       1 NA
2  A      NA  3
3  A       2  4
4  B      NA  5
5  B      NA  6
6  B      NA NA

当一个组内所有数据都是NA时,问题就出现了。如您在问题列中所看到的那样,id=B的na.locf数据来自另一个组:id=A的最后一条数据。
df1 %>% group_by(id) %>% na.locf()

Source: local data frame [6 x 3]
Groups: id [2]

     id problem    ok
  <chr>   <chr> <chr>
1     A       1  <NA>
2     A       1     3
3     A       2     4
4     B       2     5 #problem col is wrong
5     B       2     6 #problem col is wrong
6     B       2     6 #problem col is wrong

这是我期望的结果。id=B的数据与id=A中的数据无关。
     id problem    ok
  <chr>   <chr> <chr>
1     A       1  <NA>
2     A       1     3
3     A       2     4
4     B       NA     5
5     B       NA     6
6     B       NA     6

这看起来很像此处描述的错误。我最近在一个回答中被这个问题困扰了(你需要查看先前版本的答案,因为我后来进行了编辑以修复它)。 - eipi10
是的,这可能是一个bug。我很高兴有一个解决方法,就像@Akrun的答案中提到的mutate_all一样。 - Pierre Lapointe
1个回答

12

我们需要在mutate_all中使用na.locf,因为可以直接在数据集上应用na.locf。尽管按'id'分组,但在整个数据集上应用na.locf并不遵循任何分组行为。

df1 %>%
     group_by(id) %>%
     mutate_all(funs(na.locf(., na.rm = FALSE)))
#    id problem    ok
#  <fctr>   <dbl> <dbl>
#1      A       1    NA
#2      A       1     3
#3      A       2     4
#4      B      NA     5
#5      B      NA     6
#6      B      NA     6

有什么想法为什么它没有应用group by的行为? - bjoseph
@bjoseph 它正在应用分组行为。如果我们看一下“问题”,'b' 'id'已经全部是NA。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接