当前位置:  开发笔记 > 编程语言 > 正文

group_by()到fill()没有按预期工作

如何解决《group_by()到fill()没有按预期工作》经验,为你挑选了2个好方法。

我正在尝试使用dplyr和对一些格式不佳的数据执行Last Observation Carried Forward操作tidyr.它没有像我期望的那样工作.

library(dplyr)
library(tidyr)

df <- data.frame(id=c(1,1,2,2,3,3),
                 email=c('bob@email.com', NA, 'joe@email.com', NA, NA, NA))
df2 <- df %>% group_by(id) %>% fill(email)

这导致:

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

     id         email
  (dbl)        (fctr)
1     1 bob@email.com
2     1 bob@email.com
3     2 joe@email.com
4     2 joe@email.com
5     3 joe@email.com
6     3 joe@email.com

我希望它是:

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

     id         email
  (dbl)        (fctr)
1     1 bob@email.com
2     1 bob@email.com
3     2 joe@email.com
4     2 joe@email.com
5     3 NA
6     3 NA

我希望它成为后者的原因是因为group_by文档说"该group_by函数需要一个现有的tbl并将其转换为一个分组的tbl,其中操作是按组"执行的." 在这种情况下,组由id变量确定,并且以下操作是fill(email).但是,显然不是这样做的.


在任何人要求之前,如果字段都是或者character代替numeric或者,则没有区别factor.


更新 @aosmith 在Github上指出了这个未解决的问题.我要说的是,在问题得到解决之前,这个问题不会得到妥善解决.其他一切都只是一种解决方法.所以,如果有人成功解决了这个问题,并将其发布在此处,我很乐意将其标记为解决方案.



1> aosmith..:

看起来这已经在tidyr的开发版中修复了.您现在可以使用filltidyr_0.3.1.9000 获得每个id的预期结果.

df %>% group_by(id) %>% fill(email)

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

     id         email
  (dbl)        (fctr)
1     1 bob@email.com
2     1 bob@email.com
3     2 joe@email.com
4     2 joe@email.com
5     3            NA
6     3            NA



2> Gregor..:

幸运的是,你仍然可以zoo::na.locf用于此:

df %>% 
    group_by(id) %>% 
    mutate(email = zoo::na.locf(email, na.rm = FALSE))  
# Source: local data frame [6 x 2]
# Groups: id [3]
# 
#      id         email
#   (dbl)        (fctr)
# 1     1 bob@email.com
# 2     1 bob@email.com
# 3     2 joe@email.com
# 4     2 joe@email.com
# 5     3            NA
# 6     3            NA

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有