如何在仅选择一定数量的试验后获得所有参与者的均值
How to get mean for all participants after selecting only a certain number of trials
我有一个包含每个参与者 500 次试验的数据集,我想从中以不同的数量进行抽样(即我想从每个参与者中抽取相同数量的试验),然后计算每个参与者的平均值。它不是这样做,而是为每个参与者分别为每个“num”创建一个具有一个均值的文件,例如如果具有 125 次试验的参与者 1 的平均值为 426,这将是整个文件,那么参与者 1 的另一个文件具有 150 次试验且具有单个值,这就是所有参与者的情况。我的目标是为所有参与者准备一个 125 人的文件,然后是 150 人的另一个文件,等等。
num <- c(125,150,175,200,225,250,275,300,325,350,375,400)
Subset2 <- list()
for (x in 1:12){
for (j in num){
Subset2[[x]] <- improb2 %>% group_by(Participant) %>% sample_n(j) %>% summarise(mean = mean(RT))
}}
这是一个可重现的例子:
RT <- sample(200:600, 10000, replace=T)
df <- data.frame(Participant= letters[1:20])
df <- as.data.frame(df[rep(seq_len(nrow(df)), each = 500),])
improb2 <- cbind(RT, df)
improb2 <- improb2 %>% rename(Participant = `df[rep(seq_len(nrow(df)), each = 500), ]`)
子集 2 中所需的数据帧之一类似于:
Subset2[[1]]
Participant mean
<chr> <dbl>
1 P001 475.
2 P002 403.
3 P003 481.
4 P004 393.
5 P005 376.
6 P006 402.
7 P007 497.
8 P008 372.
9 P010 341.
此答案使用 tidyverse
并输出一个列表对象 data
,其中名称是样本大小。要访问每个样本量摘要,您必须使用反引号 data$`125`
。 data$`125`
是一个 tibble 对象。我在输出中做了评论,您可以根据需要将其更改为 data.frame
对象。
library(tidyverse)
num <- c(125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400)
# create function to sample data by certain size and summarize by mean
get_mean <- function(x, n) {
dplyr::group_by(x, Participant) %>% # group by participant
dplyr::sample_n(n) %>% # randomly sample observations
dplyr::summarize(mean = mean(RT), # get mean of RT
n = n(), # get sample size
.groups = "keep") %>%
dplyr::ungroup()
# add a pipe to as.data.frame if you don't want a tibble object
}
# create a list object where the names are the sample sizes
data <- lapply(setNames(num, num), function(sample_size) {get_mean(df, n = sample_size)})
head(data$`125`)
Participant mean n
<chr> <dbl> <int>
1 V1 20.2 125
2 V10 19.9 125
3 V11 19.8 125
4 V12 20.2 125
5 V2 20.5 125
6 V3 20.0 125
数据
我不是 100% 确定你的数据集是什么样的,但我相信它看起来像这样:
# create fake data for 45 participants with 500 obs per participant
df <- replicate(45, rnorm(500, 20, 4)) %>%
as.data.frame.matrix() %>%
tidyr::pivot_longer(everything(),
names_to = "Participant", # id column
values_to = "RT") %>% # value column
dplyr::arrange(Participant)
head(df) # Participant repeated 500 times, with 500 values in RT
Participant RT
<chr> <dbl>
1 V1 24.7
2 V1 15.2
3 V1 21.1
4 V1 21.6
5 V1 20.3
6 V1 25.6
如果这是一个类似的结构(长有重复的参与者 ID 和单列 RT
值),那么上面的方法应该有效。
我有一个包含每个参与者 500 次试验的数据集,我想从中以不同的数量进行抽样(即我想从每个参与者中抽取相同数量的试验),然后计算每个参与者的平均值。它不是这样做,而是为每个参与者分别为每个“num”创建一个具有一个均值的文件,例如如果具有 125 次试验的参与者 1 的平均值为 426,这将是整个文件,那么参与者 1 的另一个文件具有 150 次试验且具有单个值,这就是所有参与者的情况。我的目标是为所有参与者准备一个 125 人的文件,然后是 150 人的另一个文件,等等。
num <- c(125,150,175,200,225,250,275,300,325,350,375,400)
Subset2 <- list()
for (x in 1:12){
for (j in num){
Subset2[[x]] <- improb2 %>% group_by(Participant) %>% sample_n(j) %>% summarise(mean = mean(RT))
}}
这是一个可重现的例子:
RT <- sample(200:600, 10000, replace=T)
df <- data.frame(Participant= letters[1:20])
df <- as.data.frame(df[rep(seq_len(nrow(df)), each = 500),])
improb2 <- cbind(RT, df)
improb2 <- improb2 %>% rename(Participant = `df[rep(seq_len(nrow(df)), each = 500), ]`)
子集 2 中所需的数据帧之一类似于:
Subset2[[1]]
Participant mean
<chr> <dbl>
1 P001 475.
2 P002 403.
3 P003 481.
4 P004 393.
5 P005 376.
6 P006 402.
7 P007 497.
8 P008 372.
9 P010 341.
此答案使用 tidyverse
并输出一个列表对象 data
,其中名称是样本大小。要访问每个样本量摘要,您必须使用反引号 data$`125`
。 data$`125`
是一个 tibble 对象。我在输出中做了评论,您可以根据需要将其更改为 data.frame
对象。
library(tidyverse)
num <- c(125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400)
# create function to sample data by certain size and summarize by mean
get_mean <- function(x, n) {
dplyr::group_by(x, Participant) %>% # group by participant
dplyr::sample_n(n) %>% # randomly sample observations
dplyr::summarize(mean = mean(RT), # get mean of RT
n = n(), # get sample size
.groups = "keep") %>%
dplyr::ungroup()
# add a pipe to as.data.frame if you don't want a tibble object
}
# create a list object where the names are the sample sizes
data <- lapply(setNames(num, num), function(sample_size) {get_mean(df, n = sample_size)})
head(data$`125`)
Participant mean n
<chr> <dbl> <int>
1 V1 20.2 125
2 V10 19.9 125
3 V11 19.8 125
4 V12 20.2 125
5 V2 20.5 125
6 V3 20.0 125
数据
我不是 100% 确定你的数据集是什么样的,但我相信它看起来像这样:
# create fake data for 45 participants with 500 obs per participant
df <- replicate(45, rnorm(500, 20, 4)) %>%
as.data.frame.matrix() %>%
tidyr::pivot_longer(everything(),
names_to = "Participant", # id column
values_to = "RT") %>% # value column
dplyr::arrange(Participant)
head(df) # Participant repeated 500 times, with 500 values in RT
Participant RT
<chr> <dbl>
1 V1 24.7
2 V1 15.2
3 V1 21.1
4 V1 21.6
5 V1 20.3
6 V1 25.6
如果这是一个类似的结构(长有重复的参与者 ID 和单列 RT
值),那么上面的方法应该有效。