计算总体平均值,而不是平均值

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))

我希望缺少合适的数据框不会令人反感,我不知道如何在此处输入其中一个。非常感谢您的帮助!

有点不清楚你想要什么,但看起来你可以使用 dplyrgroup_bysummarise:

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)
}

干杯!