【问题标题】:Repeating a function for multiple columns in a subgrouping of the data对数据分组中的多列重复一个函数
【发布时间】:2016-09-29 14:48:30
【问题描述】:

我是一个完全的 R 新手,除其他外,我对一些术语感到困惑。但我的顾问希望我简化他现在研究中非常乏味的例程。

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

现在,我们为每个人定义了一个对象,并在该对象的一列上运行每个函数,但耗时太长。 我怎样才能让测试只针对一个发言者在每个变量的列上运行?我已经阅读了有关 apply 系列和 for 循环的信息,但我似乎无法让它们为我工作- -我可能缺少术语。

如果有帮助,城市会被标记为 Erie 和 Rice,说话人只有 Erie1、Erie2、Rice 1 等。

谢谢!

附:如果可能的话,我非常感谢知道如何获得可复制粘贴到 Excel 中的结果,因为我们仍在复制和粘贴单个函数的结果。

【问题讨论】:

  • 请研究此FAQ 并按照那里的建议改进您的问题。
  • 嗨,Mellsworth,您能否提供数据样本..
  • 每个帖子只问一个问题。如果你有多个问题,你可以简单地问多个问题。关于你的excel复制粘贴,有几种选择:1)停止使用excel(:)),2)将你的结果写入csv,3)使用可以直接与excel交互的包,例如openxlsx。跨度>

标签: r for-loop apply


【解决方案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的组合获得夏皮罗测试

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

试试看并告诉我们!

【讨论】:

    【解决方案2】:

    以下代码创建了一个我认为看起来像你的数据集:

    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)
    

    这种方法的缺点是我们在输出data.frame 中得到number_of_vars 乘以number_of_summary_functions 变量。或者,我们可以使用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
    ..    ...     ...      ...       ...       ...       ...
    

    这会添加一个额外的变量来对变量进行编码,并为每个汇总函数添加一个变量。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2021-11-02
      • 2021-12-06
      • 2020-08-02
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多