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
,则不会发生错误。
答案 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")