如何在data.frame中为国家创建基于年份的个人数据方法?
我正在处理一个有341k观测值和1.4k变量的大数据帧。这些观察结果包含数年来各国的个别数据。现在,我想为每个国家创建基于年份的个人数据方法:如何在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
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)