如果存在NA,则Group_by + Mutate给出不正确的结果以及连锁效应

时间:2016-06-12 19:22:07

标签: r dplyr

  

dplyr版本0.4.3

我偶然发现了一个问题,即在分组数据框中使用mutate,其中包含NA个值的组只会导致错误计算其他组 。这种行为当然似乎与dplyr中的其他函数不一致,也基于R.

可重复的例子

数据

test <- data.frame(id = rep(1:4, each = 2),
                   value = c(NA, NA, 2, 3, 3, 5, 21, 0))
> test
  id value
1  1    NA
2  1    NA
3  2     2
4  2     3
5  3     3
6  3     5
7  4    21
8  4     0

问题演示

mean.mutate <- test %>% 
               group_by(id) %>% 
               mutate(mean = mean(value, na.rm = TRUE)) %>% 
               print()

Source: local data frame [8 x 3]
Groups: id [4]

    id value  mean
    (int) (dbl) (dbl)
1     1    NA    NA
2     1    NA    NA
3     2     2   2.5
4     2     3   2.5
5     3     3    NA  # mean should be 4 for this group
6     3     5    NA
7     4    21  10.5
8     4     0  10.5

可行的替代方案

使用do

mean.do <- test %>%
           group_by(id) %>% 
           do(mutate(., mean = mean(value, na.rm = TRUE))) %>% 
           print()

    Source: local data frame [8 x 3]
    Groups: id [4]

    id value  mean
    (int) (dbl) (dbl)
1     1    NA   NaN  # notice that NaN is returned, not NA as above
2     1    NA   NaN
3     2     2   2.5
4     2     3   2.5
5     3     3   4.0  # correct
6     3     5   4.0
7     4    21  10.5
8     4     0  10.5

使用summarise

mean.summary <- test %>% 
                group_by(id) %>% 
                summarise(mean = mean(value, na.rm = TRUE)) %>% 
                print()

    Source: local data frame [4 x 2]

    id  mean
    (int) (dbl)
1     1   NaN  # as above
2     2   2.5
3     3   4.0  # correct
4     4  10.5

使用基础R的ave

within(test, mean <- ave(value, id, FUN = function(x) mean(x, na.rm = TRUE)))

id value mean
1  1    NA  NaN  # as above
2  1    NA  NaN
3  2     2  2.5
4  2     3  2.5
5  3     3  4.0  # correct
6  3     5  4.0
7  4    21 10.5
8  4     0 10.5

其他观察

如果组中至少有一个值不是NA,则不会发生错误。

1 个答案:

答案 0 :(得分:2)

<强>后续
我已在dplyr回购中的GitHub上以issue提交此内容。哈德利在适当时候回复,请见下文。

<强>解决方案
该问题已在dplyr的开发版本中得到纠正(截至2015年6月12日,目前为0.4.3.9001)。虽然存储库中README.md中包含有关如何获取开发版本的说明,但安装将失败,并且无限下载/安装循环。

以下是一次解决这两个问题的说明(来自GitHub上的issue #1904

# 1. Install dev version of 'devtools'
    if (packageVersion("devtools") < 1.6) {
        devtools::install_github("hadley/devtools")
    }

# 2. Restart R session  - IMPORTANT!

# 3. After restart install dev version of both 'lazyeval' and 'dplyr'    
    devtools::install_github("hadley/lazyeval")
    devtools::install_github("hadley/dplyr")
相关问题