在数据的子分组中重复多个列的函数

时间:2016-09-29 14:48:31

标签: r for-loop apply

我是R新手,除了其他方面,我还在努力学习一些术语。但我的顾问希望我简化他现在研究中非常繁琐的例程。

我们的数据分为2个城市,一个有5个人,一个有4个,每个发言者每个变量有110到112个数据点,共有21个变量。 (因此在Excel中,有一列用于城市,一列用于人,一列用于21个变量。)我们只是试图用平均值,中位数,stdev,过度峰度和偏度来描述数据。我们也在使用shapiro.test。

现在,我们为每个人定义一个对象,并在该对象的一列上运行每个函数,但这需要太长时间。 我如何只为一位演讲者测试每个变量的列?我已经阅读了关于apply系列和for循环的内容,但我似乎无法让它们为我工作 - - 我可能缺乏术语。

如果有帮助,这些城市会被标记为Erie和Rice,而发言者只是Erie1,Erie2,Rice 1等。

谢谢!

P.S。如果可能的话,我真的很高兴知道如何将可复制和粘贴的结果导入Excel,因为我们仍在复制和粘贴单个功能结果。

2 个答案:

答案 0 :(得分:1)

您正在寻找的功能可能是

tapply

或者

aggregate

这样的东西
DF=data.frame(Cities,Speakers,Var1,Var2,...,Varn)

这是您的data.frame,Var1到Varn是您要查找的20个变量。

我将使用shapiro.test,这可能更复杂:

T = aggregate(DF$Var1,by=list(DF$Cities),FUN=shapiro.test)

你可以通过City + Speaker

的组合获得shapiro测试
T = aggregate(DF$Var1,by=list(DF$Cities,DF$Speaker),FUN=shapiro.test)

试试并告诉我们!

答案 1 :(得分:0)

以下代码创建了一个我认为与您相似的数据集:

library(dplyr)
nobs = 2 * 5 * 110
dat = data.frame(city = sample(c('Erie', 'Rice'), nobs, replace = TRUE)) %>%
  mutate(speaker = paste0(city, sample(1:5, nobs, replace = TRUE))) %>%
  arrange(city, speaker)
data_matrix = matrix(runif(21 * nobs), nobs, 21)
colnames(data_matrix) = sprintf('Var%d', 1:21)
dat = as.data.frame(cbind(dat, data_matrix))

接下来,我们可以使用dplyr分割每个唯一城市/演讲者组合的数据。我们使用便捷函数summarise_each一次应用多个函数:

dat %>% group_by(city, speaker) %>% summarise_each(funs(mean, sd, median), Var1:Var21)
Source: local data frame [10 x 65]
Groups: city [?]

     city speaker Var1_mean Var2_mean Var3_mean Var4_mean Var5_mean Var6_mean
   (fctr)   (chr)     (dbl)     (dbl)     (dbl)     (dbl)     (dbl)     (dbl)
1    Erie   Erie1 0.5028917 0.5069724 0.4720252 0.5462675 0.5021429 0.5134384
2    Erie   Erie2 0.5378896 0.5151194 0.5429039 0.5159513 0.4622817 0.5328961
3    Erie   Erie3 0.4767338 0.4752459 0.5210605 0.4467936 0.4967070 0.4934170
4    Erie   Erie4 0.4752356 0.5497244 0.5010823 0.4944027 0.5000894 0.4926613
5    Erie   Erie5 0.5187913 0.5090330 0.4960665 0.5002147 0.4679352 0.5181322
6    Rice   Rice1 0.5237725 0.4987702 0.4989190 0.5655607 0.5295775 0.5155883
7    Rice   Rice2 0.5043830 0.4851659 0.5363700 0.5089221 0.5155034 0.5116563
8    Rice   Rice3 0.4701997 0.4877534 0.5037869 0.5250760 0.4662257 0.5158385
9    Rice   Rice4 0.4920601 0.5390394 0.5033235 0.5214137 0.4796411 0.5298566
10   Rice   Rice5 0.4922858 0.4702580 0.4977153 0.4571975 0.5128249 0.4979027
Variables not shown: Var7_mean (dbl), Var8_mean (dbl), Var9_mean (dbl),
  Var10_mean (dbl), Var11_mean (dbl), Var12_mean (dbl), Var13_mean (dbl),
  Var14_mean (dbl), Var15_mean (dbl), Var16_mean (dbl), Var17_mean (dbl),
  Var18_mean (dbl), Var19_mean (dbl), Var20_mean (dbl), Var21_mean (dbl),
  Var1_sd (dbl), Var2_sd (dbl), Var3_sd (dbl), Var4_sd (dbl), Var5_sd (dbl),
  Var6_sd (dbl), Var7_sd (dbl), Var8_sd (dbl), Var9_sd (dbl), Var10_sd (dbl),
  Var11_sd (dbl), Var12_sd (dbl), Var13_sd (dbl), Var14_sd (dbl), Var15_sd
  (dbl), Var16_sd (dbl), Var17_sd (dbl), Var18_sd (dbl), Var19_sd (dbl),
  Var20_sd (dbl), Var21_sd (dbl), Var1_median (dbl), Var2_median (dbl),
  Var3_median (dbl), Var4_median (dbl), Var5_median (dbl), Var6_median (dbl),
  Var7_median (dbl), Var8_median (dbl), Var9_median (dbl), Var10_median (dbl),
  Var11_median (dbl), Var12_median (dbl), Var13_median (dbl), Var14_median
  (dbl), Var15_median (dbl), Var16_median (dbl), Var17_median (dbl),
  Var18_median (dbl), Var19_median (dbl), Var20_median (dbl), Var21_median
  (dbl)

此方法的缺点是我们在输出number_of_vars中获得number_of_summary_functionsdata.frame个变量。或者,我们可以使用tidyr将数据从宽格式组织为长格式。然后我们使用dplyr来获得结果:

library(tidyr)
dat %>% gather(variable, value, -city, -speaker) %>% 
  group_by(city, speaker, variable) %>%
  summarise_each(funs(mean, sd, median), value)
Source: local data frame [210 x 6]
Groups: city, speaker [?]

     city speaker variable      mean        sd    median
   (fctr)   (chr)   (fctr)     (dbl)     (dbl)     (dbl)
1    Erie   Erie1     Var1 0.5531500 0.2836093 0.5969408
2    Erie   Erie1     Var2 0.4776046 0.3118265 0.4591285
3    Erie   Erie1     Var3 0.5256391 0.2927646 0.5126190
4    Erie   Erie1     Var4 0.4732230 0.2810146 0.4556239
5    Erie   Erie1     Var5 0.4647291 0.2932984 0.4461107
6    Erie   Erie1     Var6 0.5062291 0.2924258 0.5132119
7    Erie   Erie1     Var7 0.4815738 0.2928289 0.4526164
8    Erie   Erie1     Var8 0.4920858 0.2976184 0.5169642
9    Erie   Erie1     Var9 0.4900656 0.2793954 0.4935924
10   Erie   Erie1    Var10 0.4626460 0.2807313 0.4608666
..    ...     ...      ...       ...       ...       ...

这增加了一个对变量进行编码的附加变量,以及每个汇总函数的变量。