2017-04-04 116 views
3

我正尝试使用包zoo中的na.locf以及使用dplyr的分组数据。我使用的是关于这个问题的第一个解决方案:当在一个组内,所有的数据是NA发生Using dplyr window-functions to make trailing values (fill in NA values)na.locf使用来自dplyr的group_by

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 

的问题。正如您在问题列中看到的,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 
+0

这看起来像类似于[错误这里desribed(https://github.com东西以下任一组/哈德利/ dplyr /问题/ 1463)。我在[最近的回答](http://stackoverflow.com/a/43100751/496488)中被这个问题困住了(你需要看看答案的以前版本,因为我后来编辑它来修复)。 – eipi10

+0

是的,这可能是一个错误。根据@ Akrun的回答,我很高兴有一个解决方法是使用'mutate_all'。 –

回答

6

我们需要内mutate_allna.locf可以直接在数据集中应用使用na.locf。尽管它已经被“身份证”,通过应用上,充分运用数据集分组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 
+0

任何想法为什么它不是按行为应用组? – bjoseph

+0

@bjoseph它按行为应用组。如果我们看看'问题',它已经是'b''id' – akrun