Создайте новую переменную, которая является средним условием одной переменной для двух других переменных (и сохраните все остальные переменные в наборе данных) - PullRequest
3 голосов
/ 26 марта 2019

Вот (сокращенный) образец из набора данных, над которым я работаю.Выборка представляет данные из эксперимента с 2 сеансами (session_number), в каждом из которых участники выполняли 5 испытаний (trial_number) упражнения с захватом руки (итого 10 всего; 2 * 5 = 10).Каждое из 5 испытаний имеет 3 наблюдения силы сцепления рук (percent_of_maximum).Я хочу получить среднее (ниже, я называю это mean_by_trial) из этих 3 наблюдений для каждого из 10 испытаний.

Наконец, и это то, на чем я застрял, я хочу вывести данныенабор длиной 20 строк (одна строка для каждого уникального испытания, есть 2 участника и 10 испытаний для каждого участника; 2 * 10 = 20), И сохраняет все остальные переменные.Все остальные переменные (в этом примере: placebo, support, personality и perceived_difficulty) будут одинаковыми для каждого уникального Participant, trial_number или session_number (см. Примернабор данных ниже).

Я пробовал это с использованием ddply, что довольно много, чего я хочу, но новый набор данных не содержит других переменных в наборе данных (new_dat содержит только trial_number, session_number, Participant и новая переменная mean_by_trial).Как я могу поддерживать другие переменные?

#create sample data frame
dat <- data.frame(
  Participant = rep(1:2, each = 30),
  placebo = c(replicate(15, "placebo"), replicate(15, "control"), replicate(15, "control"), replicate(15, "placebo")),
  support = rep(sort(rep(c("support", "control"), 3)), 10),
  personality = c(replicate(30, "nice"), replicate(30, "naughty")),
  session_number = c(rep(1:2, each = 15), rep(1:2, each = 15)),
  trial_number = c(rep(1:5, each = 3), rep(1:5, each = 3), rep(1:5, each = 3), rep(1:5, each = 3)),
  percent_of_maximum = runif(60, min = 0, max = 100),
  perceived_difficulty = runif(60, min = 50, max = 100)
)

#this is what I have tried so far
library(plyr)
new_dat <- ddply(dat, .(trial_number, session_number, Participant), summarise, mean_by_trial = mean(percent_of_maximum), .drop = FALSE)

Я хочу, чтобы new_dat содержал все переменные в dat плюс переменную mean_by_trial.Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Мы можем использовать mutate вместо summarise для создания столбца в наборе данных, а затем сделать slice

library(dplyr)
out <- ddply(dat, .(trial_number, session_number, Participant), 
   plyr::mutate, mean_by_trial = mean(percent_of_maximum), .drop = FALSE)
out %>%
       group_by(trial_number, session_number, Participant) %>%
       slice(1)

Если мы используем dplyr, то это может всебыть внутри цепи

newdat <- dat %>% 
            group_by(trial_number, session_number, Participant) %>%
            mutate(mean_by_trial = mean(percent_of_maximum)) %>%
            slice(1)
head(newdat)
# A tibble: 6 x 9
# Groups:   trial_number, session_number, Participant [6]
  Participant placebo support personality session_number trial_number percent_of_maximum perceived_difficulty mean_by_trial
#        <int> <fct>   <fct>   <fct>                <int>        <int>              <dbl>                <dbl>         <dbl>
#1           1 placebo control nice                     1            1               71.5                 95.5          73.9
#2           2 control control naughty                  1            1               38.9                 63.8          67.7
#3           1 control support nice                     2            1               97.1                 54.2          68.4
#4           2 placebo support naughty                  2            1               62.9                 86.2          40.4
#5           1 placebo support nice                     1            2               49.0                 95.8          65.7
#6           2 control support naughty                  1            2               80.9                 74.6          68.3
1 голос
/ 26 марта 2019

Вот ответ tidyverse. Сначала вы хотите group_by переменные, представляющие интерес. Затем вычислите желаемое среднее значение в новом столбце, используя mutate.

Поскольку значение в новом среднем столбце будет повторяться для всех переменных, используйте функцию distinct, чтобы сохранить уникальные строки. Другими словами, выберите одну строку для каждой комбинации Participant, session_number и trial_number.

Это ответ (https://stackoverflow.com/a/39092166/9941764) предоставляется в: R - dplyr Суммировать и сохранять другие столбцы

new_dat <- dat %>%
    group_by(Participant, session_number, trial_number) %>%
    mutate(mean = mean(percent_of_maximum)) %>% 
    distinct(mean, .keep_all = TRUE)
...