【问题标题】:Data Frame: mean over certain variables, ignore but keep others数据框:对某些变量表示平均值,忽略但保留其他变量
【发布时间】:2019-04-19 11:39:24
【问题描述】:

我第一次使用 R 分析我的数据,这有点挑战性。我有一个数据框,其中包含如下所示的数据:

head(data)
      subject group age trial cond acc  rt
    1   S1     2     1     1   1    1   5045
    2   S1     2     1     2   2    1   8034
    3   S1     2     1     3   1    1   6236
    4   S1     2     1     4   2    1   8087
    5   S1     2     1     5   3    0   8756
    6   S1     2     1     6   1    1   6619

我想计算 rt 的每个条件下每个主题的平均值和标准偏差,以及 acc 的每个条件下每个主题的总和。所有其他变量都应该保持不变(组和年龄是特定于受试者的,可以忽略试验)。

我尝试过使用聚合,但这似乎有点复杂,因为我必须分几个步骤来完成并重新添加信息......

感谢您的帮助 =)

编辑:我意识到我并不清楚。我希望试验被忽略,并以每个条件每个受试者一行结束:

head(data_new)
      subject group age cond rt_mean  rt_sd    acc_sum
    1   S1     2     1  1    7581     100      5
    2   S2     2     1  2    8034     150      4

很抱歉造成混乱!

【问题讨论】:

    标签: r dataframe sum mean reorganize


    【解决方案1】:

    如果您不介意使用data.table 包:

    library(data.table)
    data <- data.table(data)
    data[, ':=' (rt_mean = mean(rt), rt_sd = sd(rt), acc_sum = sum(acc)), by = .(subject, cond)]
    data
    
       subject group age trial cond acc   rt  rt_mean     rt_sd acc_sum
    1:      S1     2   1     1    1   1 5045 5966.667 820.83758       3
    2:      S1     2   1     2    2   1 8034 8060.500  37.47666       2
    3:      S1     2   1     3    1   1 6236 5966.667 820.83758       3
    4:      S1     2   1     4    2   1 8087 8060.500  37.47666       2
    5:      S1     2   1     5    3   0 8756 8756.000        NA       0
    6:      S1     2   1     6    1   1 6619 5966.667 820.83758       3
    

    编辑:

    如果你想去掉一些变量和重复的行,你只需要一个小的修改——删除:=赋值运算符(而不是添加新的列,它现在将创建一个新的data.table),添加要保留的变量并使用unique 函数:

    unique(dt[, .(group, age, rt_mean = mean(rt), rt_sd = sd(rt), acc_sum = sum(acc)), by = .(subject, cond)])
       subject cond group age  rt_mean     rt_sd acc_sum
    1:      S1    1     2   1 5966.667 820.83758       3
    2:      S1    2     2   1 8060.500  37.47666       2
    3:      S1    3     2   1 8756.000        NA       0
    

    如果您还想删除缺少值的行,请使用na.omit 函数。

    【讨论】:

    • 首先感谢您的帮助。这看起来真的很接近,但我很抱歉,我描述我的问题有点不清楚/错误:我想摆脱试验并最终在每个条件下为每个受试者一行而不是对特定的每次试验具有相同的 rt_mean条件和主题。
    • @Max 好的,它需要一个简单的修改,我编辑了答案来解决它:)
    【解决方案2】:

    dplyr 包就是为此而生的:

    library(dplyr)
    d %>% 
      group_by(subject, cond) %>% # we group by the two values
      summarise(
        mean_rt = mean(rt, na.rm=T),
        sd_rt = sd(rt, na.rm=T),
        sum_acc = sum(acc, na.rm=T) # here we apply each function to summarise values
      )
    
    
    # A tibble: 3 x 5
    # Groups:   subject [?]
      subject  cond mean_rt sd_rt sum_acc
      <fct>   <int>   <dbl> <dbl>   <int>
    1 S1          1   5967. 821.        3
    2 S1          2   8060.  37.5       2
    3 S1          3   8756   NA         0
    # NA for the last sd_rt is because you can't have 
    # sd for a single obs.
    

    基本上你需要group_by你需要用作分组的列(一个或多个),然后在summarise中,你应用你需要的每个函数(meansdsum, ecc) 到每个变量 (rt, acc, ecc)。

    如果您想保留所有变量,请将 summarise 更改为 mutate

    d %>% 
      select(-trial) %>% # use select with -var_name to eliminate columns 
      group_by(subject, cond) %>% 
      mutate(
        mean_rt = mean(rt, na.rm=T),
        sd_rt = sd(rt, na.rm=T),
        sum_acc = sum(acc, na.rm=T)
      ) %>% 
      ungroup()
    # A tibble: 6 x 9
    subject group   age  cond   acc    rt mean_rt sd_rt sum_acc
    <fct>   <int> <int> <int> <int> <int>   <dbl> <dbl>   <int>
    1 S1          2     1     1     1  5045   5967. 821.        3
    2 S1          2     1     2     1  8034   8060.  37.5       2
    3 S1          2     1     1     1  6236   5967. 821.        3
    4 S1          2     1     2     1  8087   8060.  37.5       2
    5 S1          2     1     3     0  8756   8756   NA         0
    6 S1          2     1     1     1  6619   5967. 821.        3
    

    更新基于操作请求,也许这就是你需要的:

    d %>% 
      group_by(subject, cond, group, age) %>% 
      summarise(
        mean_rt = mean(rt, na.rm=T),
        sd_rt = sd(rt, na.rm=T),
        sum_acc = sum(acc, na.rm=T)
      ) 
    # A tibble: 3 x 7
    # Groups:   subject, cond, group [?]
    subject  cond group   age mean_rt sd_rt sum_acc
    <fct>   <int> <int> <int>   <dbl> <dbl>   <int>
    1 S1          1     2     1   5967. 821.        3
    2 S1          2     2     1   8060.  37.5       2
    3 S1          3     2     1   8756   NA         0
    

    使用的数据:

    tt <- "subject group age trial cond acc  rt
    S1     2     1     1   1    1   5045
    S1     2     1     2   2    1   8034
    S1     2     1     3   1    1   6236
    S1     2     1     4   2    1   8087
    S1     2     1     5   3    0   8756
    S1     2     1     6   1    1   6619"
    
    d <- read.table(text=tt, header=T)
    

    【讨论】:

    • 谢谢!一般来说,它看起来不错,但是,如果我使用 summarise,我会丢失所有我想保持不变的变量(例如组),但是如果我使用 mutate,则不会消除“重复”行......有没有如何忽略“试验”并在每种情况下为每个主题获得一行?
    • 您好,请查看我的更新,使用select(-trial) 删除该列。
    • 如果你需要添加更多的分组条件试试group_by(subject, cond, group),在group_by你可以添加更多的变量。
    • 基本上如果您需要更多分组变量,只需添加最小值group_by()
    【解决方案3】:

    如果您想计算例如条件 1 下受试者 S1 的 rt 平均值,您可以使用mean(data[data$subject == "S1" &amp; data$cond == 1, 7])

    我希望这能让您了解如何过滤您的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2020-07-11
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多