如何在data.frame中为国家创建基于年份的个人数据方法?

如何在data.frame中为国家创建基于年份的个人数据方法?,r,R,我正在处理一个有341k观测值和1.4k变量的大数据帧。这些观察结果包含数年来各国的个别数据。现在,我想为每个国家创建基于年份的个人数据方法: set.seed(42) ctry <- c(rep("AU", 6),rep("BY", 6),rep("CH", 6),rep("DE", 6)) year <- c(rep(2001,2),rep(2002,2),rep(2003,2),rep(2001,2),rep(2002,2),rep(2003,2), rep(200

我正在处理一个有341k观测值和1.4k变量的大数据帧。这些观察结果包含数年来各国的个别数据。现在,我想为每个国家创建基于年份的个人数据方法:

set.seed(42)
ctry <- c(rep("AU", 6),rep("BY", 6),rep("CH", 6),rep("DE", 6))
year <- c(rep(2001,2),rep(2002,2),rep(2003,2),rep(2001,2),rep(2002,2),rep(2003,2),
      rep(2001,2),rep(2002,2),rep(2003,2),rep(2001,2),rep(2002,2),rep(2003,2))
a <- rnorm(24,1,.1)
b <- rnorm(24,2,.2)
c <- rnorm(24,3,.3)
(df <- data.frame(ctry,year,a,b,c))

akrun的看起来很有前途,但我没能把它配上。也许有更简洁的解决方案?谢谢。

基于OP的
ave
输出,我们似乎在按相同的列进行分组,并得到其他列的
平均值。因此,我们不需要使用
ave
,而是需要按组进行
总结。这可以通过
dplyr

library(dplyr)
df %>% 
   group_by(ctry, year) %>% 
   summarise_at(.vars = names(df)[3:5], funs(Mean = mean))
fMean <- function(dat, grp1, grp2, otherVars){
    #enquo does similar functionality as substitute from base R
    grp1 <- enquo(grp1) 
    grp2 <- enquo(grp2)

    dat %>%
       #evaluate the quosure by unquote (UQ or !!)
       group_by(!!grp1, !!grp2) %>%
       summarise_at(.vars = otherVars, funs(Mean = mean))


} 

fMean(df, ctry, year, names(df)[3:5])
#     ctry  year    a_Mean   b_Mean   c_Mean
#   <fctr> <dbl>     <dbl>    <dbl>    <dbl>
#1      AU  2001 1.0403130 2.146472 3.033630
#2      AU  2002 1.0497996 1.797957 2.930713
#3      AU  2003 1.0149072 1.982010 3.332794
#4      BY  2001 1.0708431 2.116029 3.054947
#5      BY  2002 1.0977855 2.042618 3.115368
#6      BY  2003 1.1795758 1.878795 2.593769
#7      CH  2001 0.9166175 1.836463 2.972699
#8      CH  2002 1.0251315 1.762191 3.297234
#9      CH  2003 0.8529646 1.984494 3.086288
#10     DE  2001 0.9439823 2.003146 3.206153
#11     DE  2002 0.8956026 1.906454 3.246241
#12     DE  2003 1.0521379 2.063271 2.830004

或者,如果我们需要获得除分组变量外的所有变量的
平均值
,正如@StevenBeaupre所建议的,我们可以使用
汇总所有变量

df %>% 
   group_by(ctry, year) %>% 
   summarise_all(mean)
#    ctry  year         a        b        c
#   <fctr> <dbl>     <dbl>    <dbl>    <dbl>
#1      AU  2001 1.0403130 2.146472 3.033630
#2      AU  2002 1.0497996 1.797957 2.930713
#3      AU  2003 1.0149072 1.982010 3.332794
#4      BY  2001 1.0708431 2.116029 3.054947
#5      BY  2002 1.0977855 2.042618 3.115368
#6      BY  2003 1.1795758 1.878795 2.593769
#7      CH  2001 0.9166175 1.836463 2.972699
#8      CH  2002 1.0251315 1.762191 3.297234
#9      CH  2003 0.8529646 1.984494 3.086288
#10     DE  2001 0.9439823 2.003146 3.206153
#11     DE  2002 0.8956026 1.906454 3.246241
#12     DE  2003 1.0521379 2.063271 2.830004

除了
dplyr
,我们还可以使用
data.table

library(data.table)
setDT(df)[, lapply(.SD, mean), .(ctry, year)]
这里,
setDT
将“data.frame”转换为
data.table
,按“ctry”、“year”分组,我们循环遍历data.table子集的列,得到
平均值。如果我们只需要获取特定列的
平均值
,请在
.SDcols

setDT(df)[, lapply(.SD, mean), .(ctry, year), .SDcols = a:c]
base R
聚合

aggregate(.~ctry + year, df, mean)

我得到了
错误:.cols应该是字符/数字向量或列对象
@jaySf我正在使用
devel
版本的
dplyr
(即将发布的0.6.0`。你的版本是什么?我有
dplyr
0.5.0。
summary\u在
没有工作,但是
summary\u都有!我期待着0.6.0,看起来很棒!@jaySf你可以从github下载devel版本,即
https://github.com/tidyverse/dplyr
并使用
devtools::安装ithub(“tidyverse/dplyr”)
I添加了data.table和base R方法
aggregate(.~ctry + year, df, mean)