数据框:表示某些变量,忽略但保留其他变量

时间:2018-11-16 09:46:48

标签: r dataframe sum mean reorganize

我第一次使用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

很抱歉造成混乱!

3 个答案:

答案 0 :(得分: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

编辑:

如果您想摆脱一些变量和重复的行,则只需进行少量修改-删除:=赋值运算符(而不是添加新的列,它现在将创建一个新的{{1 }}),添加您要保留的变量并使用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 函数。

答案 1 :(得分:0)

例如,如果要计算条件1下主题S1的rt平均值,则可以使用mean(data[data$subject == "S1" & data$cond == 1, 7])

我希望这可以为您提供一个过滤值的思路。

答案 2 :(得分:0)

软件包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内,应用所需的每个功能(mean,{{ 1}},sd,ecc)到每个变量(sumrt,ecc)。

如果要保留所有变量,请用acc更改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