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

3
这是我正在处理的数据集的(缩短版)样本。该样本代表了一个有2个会话(session_number)实验的数据,每个参与者在每个会话中完成5次握力锻炼试验(因此总共进行10次试验;2*5 = 10)。每个试验都有3个握力强度观测值(percent_of_maximum)。我想要获得这些3个观测值的平均值(下面称之为mean_by_trial),用于每个10个试验中的每个试验。
最后,这正是我卡住的地方,我想输出一个长度为20行的数据集(每个独特试验一个行, 每个参与者有10个试验; 2*10 = 20),并保留所有其他变量。所有其他变量(在示例中有:placebosupportpersonalityperceived_difficulty)对于每个独特的Participanttrial_numbersession_number都将是相同的(请参阅以下示例数据集)。
我尝试使用ddply来完成这个任务,基本上就是我想要的,但新数据集不包含数据集中的其他变量(new_dat只包含trial_numbersession_numberParticipant和新的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
我们可以使用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
这里有一个简洁明了的tidyverse解决方案。首先,您需要按感兴趣的变量进行group_by。然后使用mutate在一个新列中计算所需的平均值。
由于新均值列中的值会在变量之间重复出现,因此使用distinct函数保留唯一行。换句话说,为每个Participantsession_numbertrial_number组合选择一行。
这是答案(https://dev59.com/yVkT5IYBdhLWcg3wFroT#39092166)提供在: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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接