创建一个新变量,该变量是一个变量以其他两个变量为条件的平均值(并在数据集中保留所有其他变量)

时间:2019-03-26 11:51:15

标签: r dplyr plyr

这是我正在处理的数据集中的一个(缩短的)样本。该样本代表来自2个疗程(session_number)的实验的数据,在每个疗程中,参与者完成了5项关于手握练习的试验(trial_number)(因此,总共10个; 2 * 5 = 10) 。 5个试验中的每个试验都有3个关于握力(percent_of_maximum)的观察。我想获得这10个试验中每3个观察值的平均值(以下称为mean_by_trial

最后,这就是我要坚持的事情,我想输出一个20行长的数据集(每个唯一试验一行,每个参与者有2个参与者,每个参与者10个审判; 2 * 10 = 20 ),并且保留所有其他变量。所有其他变量(在示例中有:placebosupportpersonalityperceived_difficulty)对于每个唯一的Participant,{ {1}}或trial_number(请参阅下面的示例数据集)。

我使用session_number进行了尝试,这几乎是我想要的,但是新数据集不包含数据集中的其他变量(ddply仅包含new_dattrial_numbersession_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变量。谢谢!

2 个答案:

答案 0 :(得分:2)

我们可以使用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 :(得分:1)

这是一个tidyverse的答案。首先,您要group_by感兴趣的变量。然后使用mutate在新列中计算所需的均值。

由于新的均值列中的值将在各个变量之间重复,因此请使用distinct函数来保留唯一行。换句话说,为Participantsession_numbertrial_number的每种组合选择一行。

这是答案(https://stackoverflow.com/a/39092166/9941764) 在R - dplyr Summarize and Retain Other Columns

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