计算总体平均值,而不是平均值
Calculating the overall mean, not a mean of means
我觉得这是一个 真的 简单的问题,我应该能够弄清楚,但我已经尝试了一段时间但现在没有成功。我有一个数据框,希望通过 cond 类型和扬声器类型确定总体平均 rt,忽略位置。我该怎么做?
简单地说,三组人读句子(“演讲者”)。每个“cond”是不同的句型(“ExpA,B,C,D”),全部由5个部分(“Position”)组成。每个部分在每个句型中都有相应的阅读时间。我想看整体每组每个条件(所有位置一起)的阅读时间。例如,条件“ExpA”的 FR 参与者的所有位置阅读时间(0、1、2、3、4)的总和,以比较他们是更快还是“ExpA”总体上比“ExpB”慢。
Dataframe:
Speaker: FR, EN, KR
cond (ExpA, ExpB, ExpC, ExpD)
Position (0, 1, 2, 3, 4)
rt: 1000, 1500, 2000, 1500, 1000
我该怎么做?我已经能够使用下面的代码通过位置、条件和说话者获得平均 rt,但是当我删除“位置”时认为它会给我每个“条件”的组合平均值,它只给我一个值这太小了,不可能是 5 个均值的总和,而看起来是这些均值的均值。
pcsmeans = ddply(subj.means, .(cond, position, speaker), summarise, sd = sd(mean.rt), mean = mean(mean.rt))
我希望缺少合适的数据框不会令人反感,我不知道如何在此处输入其中一个。非常感谢您的帮助!
有点不清楚你想要什么,但看起来你可以使用 dplyr
的 group_by
和 summarise
:
library(dplyr)
df <- data.frame(Speaker = rep(c("FR", "EN", "KR"),20),
cond = rep(c("ExpA", "ExpB", "ExpC", "ExpD"),15),
Position = rep(c(0, 1, 2, 3, 4),12),
rt = runif(min=1000, max=2000, n = 60))
df %>% group_by(Speaker, cond) %>% summarise(mean_rt = mean(rt), overall_rt = sum(rt))
这为您提供了 Speaker 和条件的平均值和总和:
# A tibble: 12 x 4
# Groups: Speaker [3]
Speaker cond mean_rt overall_rt
<fct> <fct> <dbl> <dbl>
1 EN ExpA 1690. 8449.
2 EN ExpB 1625. 8127.
3 EN ExpC 1588. 7940.
4 EN ExpD 1475. 7375.
5 FR ExpA 1321. 6603.
6 FR ExpB 1584. 7922.
7 FR ExpC 1493. 7465.
8 FR ExpD 1463. 7315.
9 KR ExpA 1393. 6965.
10 KR ExpB 1540. 7702.
11 KR ExpC 1569. 7847.
12 KR ExpD 1570. 7849.
不太清楚你的实际问题是什么。既然你已经提到你不知道如何添加样本 data.frame,这里有一个我想适合你的问题的例子:
#generate mock df
speaker<-c("FR", "EN", "KR")
exp<-c("ExpA", "ExpB", "ExpC", "ExpD")
position<-c(0, 1, 2, 3, 4)
#rt<- 1000, 1500, 2000, 1500, 1000
data<-expand.grid(speaker,exp,position)
names(data)<-c('speaker','exp','position')
data$rt<-rnorm(n=nrow(data),mean = 1300,sd = 250)
head(data)
speaker exp position rt
FR ExpA 0 1269
EN ExpA 0 859
KR ExpA 0 863
FR ExpB 0 718
EN ExpB 0 956
KR ExpB 0 867
...
从现在开始,有多种选择。我首选的快速高效工具带有 sqldf 包,它引入了 sql 类语言结构。 SQL 超级高效且易于阅读:
require(sqldf)
sqldf::sqldf('select count(*) as N, speaker, exp, avg(rt) as mean from df group by speaker, exp')
显然,在解决问题时,R 有上百万种工具,但这是我目前最喜欢的。对于任何更复杂的东西(即自定义函数等),我可能会使用 for 循环遍历每个 reader 和 exp 组合:
data$identifier <- paste0(data$speaker,data$exp) # helper column
results <- data.frame()
for ( ident in unique(data$identifier) ){
df <- subset(data, identifier == ident)
speaker<-unique(df$speaker)
exp<-unique(df$exp)
mean<-sum( df$rt )
se<-sd( df$rt )/ sqrt( nrow(df) )
quantileButTransformed <- t(as.data.frame(quantile(df$rt))) #whatever you can think of
newLine<-data.frame(speaker = speaker, exp = exp,N = nrow(df), mean = mean, se = se, quantile = quantileButTransformed)
results <- rbind(results, newLine)
}
干杯!
我觉得这是一个 真的 简单的问题,我应该能够弄清楚,但我已经尝试了一段时间但现在没有成功。我有一个数据框,希望通过 cond 类型和扬声器类型确定总体平均 rt,忽略位置。我该怎么做?
简单地说,三组人读句子(“演讲者”)。每个“cond”是不同的句型(“ExpA,B,C,D”),全部由5个部分(“Position”)组成。每个部分在每个句型中都有相应的阅读时间。我想看整体每组每个条件(所有位置一起)的阅读时间。例如,条件“ExpA”的 FR 参与者的所有位置阅读时间(0、1、2、3、4)的总和,以比较他们是更快还是“ExpA”总体上比“ExpB”慢。
Dataframe:
Speaker: FR, EN, KR
cond (ExpA, ExpB, ExpC, ExpD)
Position (0, 1, 2, 3, 4)
rt: 1000, 1500, 2000, 1500, 1000
我该怎么做?我已经能够使用下面的代码通过位置、条件和说话者获得平均 rt,但是当我删除“位置”时认为它会给我每个“条件”的组合平均值,它只给我一个值这太小了,不可能是 5 个均值的总和,而看起来是这些均值的均值。
pcsmeans = ddply(subj.means, .(cond, position, speaker), summarise, sd = sd(mean.rt), mean = mean(mean.rt))
我希望缺少合适的数据框不会令人反感,我不知道如何在此处输入其中一个。非常感谢您的帮助!
有点不清楚你想要什么,但看起来你可以使用 dplyr
的 group_by
和 summarise
:
library(dplyr)
df <- data.frame(Speaker = rep(c("FR", "EN", "KR"),20),
cond = rep(c("ExpA", "ExpB", "ExpC", "ExpD"),15),
Position = rep(c(0, 1, 2, 3, 4),12),
rt = runif(min=1000, max=2000, n = 60))
df %>% group_by(Speaker, cond) %>% summarise(mean_rt = mean(rt), overall_rt = sum(rt))
这为您提供了 Speaker 和条件的平均值和总和:
# A tibble: 12 x 4
# Groups: Speaker [3]
Speaker cond mean_rt overall_rt
<fct> <fct> <dbl> <dbl>
1 EN ExpA 1690. 8449.
2 EN ExpB 1625. 8127.
3 EN ExpC 1588. 7940.
4 EN ExpD 1475. 7375.
5 FR ExpA 1321. 6603.
6 FR ExpB 1584. 7922.
7 FR ExpC 1493. 7465.
8 FR ExpD 1463. 7315.
9 KR ExpA 1393. 6965.
10 KR ExpB 1540. 7702.
11 KR ExpC 1569. 7847.
12 KR ExpD 1570. 7849.
不太清楚你的实际问题是什么。既然你已经提到你不知道如何添加样本 data.frame,这里有一个我想适合你的问题的例子:
#generate mock df
speaker<-c("FR", "EN", "KR")
exp<-c("ExpA", "ExpB", "ExpC", "ExpD")
position<-c(0, 1, 2, 3, 4)
#rt<- 1000, 1500, 2000, 1500, 1000
data<-expand.grid(speaker,exp,position)
names(data)<-c('speaker','exp','position')
data$rt<-rnorm(n=nrow(data),mean = 1300,sd = 250)
head(data)
speaker exp position rt
FR ExpA 0 1269
EN ExpA 0 859
KR ExpA 0 863
FR ExpB 0 718
EN ExpB 0 956
KR ExpB 0 867
...
从现在开始,有多种选择。我首选的快速高效工具带有 sqldf 包,它引入了 sql 类语言结构。 SQL 超级高效且易于阅读:
require(sqldf)
sqldf::sqldf('select count(*) as N, speaker, exp, avg(rt) as mean from df group by speaker, exp')
显然,在解决问题时,R 有上百万种工具,但这是我目前最喜欢的。对于任何更复杂的东西(即自定义函数等),我可能会使用 for 循环遍历每个 reader 和 exp 组合:
data$identifier <- paste0(data$speaker,data$exp) # helper column
results <- data.frame()
for ( ident in unique(data$identifier) ){
df <- subset(data, identifier == ident)
speaker<-unique(df$speaker)
exp<-unique(df$exp)
mean<-sum( df$rt )
se<-sd( df$rt )/ sqrt( nrow(df) )
quantileButTransformed <- t(as.data.frame(quantile(df$rt))) #whatever you can think of
newLine<-data.frame(speaker = speaker, exp = exp,N = nrow(df), mean = mean, se = se, quantile = quantileButTransformed)
results <- rbind(results, newLine)
}
干杯!