【问题标题】:na.locf using group_by from dplyrna.locf 使用来自 dplyr 的 group_by
【发布时间】:2017-04-04 16:04:29
【问题描述】:

我正在尝试将包zoo 中的na.locf 与使用dplyr 的分组数据一起使用。我在这个问题上使用第一个解决方案:Using dplyr window-functions to make trailing values (fill in NA values)

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

【问题讨论】:

  • 这看起来类似于bug desribed here。我在a recent answer 中被这个问题抓住了(您需要查看以前版本的答案,因为我后来对其进行了编辑以修复)。
  • 是的,这可能是一个错误。根据@Akrun 的回答,我很高兴mutate_all 有一个解决方法。

标签: r dplyr zoo


【解决方案1】:

我们需要在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

【讨论】:

  • 知道为什么它不按行为应用分组吗?
  • @bjoseph 它正在按行为应用组。如果我们看'问题',它已经是'b''id'的所有NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2016-11-20
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多