问题已从原始版本进行了编辑。
在阅读这个有趣的讨论之后,我想知道如何使用dplyr在列中替换缺失值,例如Lahman击球数据:
Source: local data frame [96,600 x 3]
Groups: teamID
yearID teamID G
1 2004 SFN 11
2 2006 CHN 43
3 2007 CHA 2
4 2008 BOS 5
5 2009 SEA 3
6 2010 SEA 4
7 2012 NYA NA
以下的内容并不像我预期的那样起作用。
library(dplyr)
library(Lahman)
df <- Batting[ c("yearID", "teamID", "G") ]
df <- group_by(df, teamID )
df$G[is.na(df$G)] <- mean(df$G, na.rm = TRUE)
源代码:本地数据框[20 x 3] 分组:年份ID,团队ID
yearID teamID G
1 2004 SFN 11.00000
2 2006 CHN 43.00000
3 2007 CHA 2.00000
4 2008 BOS 5.00000
5 2009 SEA 3.00000
6 2010 SEA 4.00000
7 2012 NYA **49.07894**
> mean(Batting$G_battin, na.rm = TRUE)
[1] **49.07894**
实际上,它归因于整体均值而不是组均值。在dplyr链中,你会如何做到这一点?使用基本R中的
transform
也无法解决此问题,因为它归因于整体均值而不是组均值。此外,这种方法将数据转换为常规数据框。有没有更好的方法来解决这个问题?df %.%
group_by( yearID ) %.%
transform(G = ifelse(is.na(G),
mean(G, na.rm = TRUE),
G)
)
编辑:将
transform
替换为mutate
会导致以下错误。Error in mutate_impl(.data, named_dots(...), environment()) :
INTEGER() can only be applied to a 'integer', not a 'double'
编辑:添加as.integer似乎解决了错误,并且确实产生了预期的结果。另请参阅@eddi的答案。
df %.%
group_by( teamID ) %.%
mutate(G = ifelse(is.na(G), as.integer(mean(G, na.rm = TRUE)), G))
Source: local data frame [96,600 x 3]
Groups: teamID
yearID teamID G
1 2004 SFN 11
2 2006 CHN 43
3 2007 CHA 2
4 2008 BOS 5
5 2009 SEA 3
6 2010 SEA 4
7 2012 NYA 47
> mean_NYA <- mean(filter(df, teamID == "NYA")$G, na.rm = TRUE)
> as.integer(mean_NYA)
[1] 47
编辑:根据@Romain的评论,我从GitHub上安装了dplyr。
> head(df,10)
yearID teamID G
1 2004 SFN 11
2 2006 CHN 43
3 2007 CHA 2
4 2008 BOS 5
5 2009 SEA 3
6 2010 SEA 4
7 2012 NYA NA
8 1954 ML1 122
9 1955 ML1 153
10 1956 ML1 153
> df %.%
+ group_by(teamID) %.%
+ mutate(G = ifelse(is.na(G), mean(G, na.rm = TRUE), G))
Source: local data frame [96,600 x 3]
Groups: teamID
yearID teamID G
1 2004 SFN 0
2 2006 CHN 0
3 2007 CHA 0
4 2008 BOS 0
5 2009 SEA 0
6 2010 SEA 1074266112
7 2012 NYA 90693125
8 1954 ML1 122
9 1955 ML1 153
10 1956 ML1 153
.. ... ... ...
所以我没有收到错误(很好),但是我得到了一个(看起来)奇怪的结果。
ifelse
模糊的语义。我已经添加了一个问题以确保我更加深入地思考它 https://github.com/hadley/dplyr/issues/254 - hadley