对行的子集执行计算

时间:2019-01-08 23:45:07

标签: r subset

我真的希望这不是重复的,但我找不到适用于我的情况的答案。

我有面板数据,我需要按年计算平均得分。 我的数据看起来像这样

df <- data.frame(
"Country" = c("USA", "EU", "Africa","USA", "EU", "Africa","USA", "EU", "Africa"),
"Year" = c(1970, 1970, 1970, 1980, 1980, 1980,1990, 1990, 1990), 
"Score" = runif(9, min=20, max=100),
"Other" = rnorm(9),
stringsAsFactors = FALSE)

我的目标是计算每年的平均值“分数”。换句话说,因此所有国家在1970年,1980年和1990年的平均收入水平都不同。

我尝试将其分组的操作,

mean<- df %>%
  group_by(Year) %>%
  summarise(mean(na.omit(df$Score)))

但是这些代码给了我分数的平均值,而不是每年的平均值

我也尝试使用ddply,但是由于某些原因,它似乎不起作用

mean2 <- ddply(.data = df, variables = .(Year), (mean(df$Score)))

有人会知道如何为我提供用于大型数据库的直观代码吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

问题是您使用了df$Score而不是Score;杀死了分组效应。相反,我们想要

df %>% group_by(Year) %>% 
  summarise(meanScore = mean(Score, na.rm = TRUE))
# A tibble: 3 x 2
#    Year meanScore
#   <dbl>     <dbl>
# 1  1970      80.0
# 2  1980      69.9
# 3  1990      52.9

ddply相同:

ddply(df, .(Year), summarise, meanScore = mean(Score, na.rm = TRUE))
#   Year meanScore
# 1 1970  80.02505
# 2 1980  69.92299
# 3 1990  52.87667

当然,您也可以在底数为R的情况下找到它,如

tapply(df$Score, df$Year, mean, na.rm = TRUE)
#     1970     1980     1990 
# 80.02505 69.92299 52.87667