Фрейм данных: среднее значение по определенным переменным, игнорирование, но сохранение других - PullRequest
0 голосов
/ 16 ноября 2018

Я анализирую свои данные с помощью 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 и сумму для каждого субъекта в каждом условии для соотв. Все остальные переменные должны оставаться неизменными (группа и возраст зависят от конкретного предмета, и пробы можно не принимать во внимание).

Я пытался использовать агрегат, но это казалось довольно сложным, потому что мне приходилось делать это в несколько шагов и повторно добавлять информацию ...

Буду благодарен за любую помощь =)

Редактировать: я понимаю, что я не был ясен. Я хочу, чтобы испытание не принималось во внимание и в итоге получалось по одной строке для каждого условия:

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 голосов
/ 16 ноября 2018

Если вы не возражаете против использования пакета 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

Edit:

Если вы хотите избавиться от некоторых переменных и дублирующихся строк, вам потребуется лишь небольшая модификация - удалите оператор присваивания := (вместо добавления новых столбцов теперь будет создан новый 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.

0 голосов
/ 16 ноября 2018

Пакет 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, sd, sum, 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)
0 голосов
/ 16 ноября 2018

Если вы хотите вычислить, например, среднее значение rt для субъекта S1 при условии 1, вы можете использовать mean(data[data$subject == "S1" & data$cond == 1, 7]).

Надеюсь, это даст вам представление о том, как вы можете фильтровать свои значения.

...