从data.frame中的列中的每一行中随机选择值,并将它们平均为R

时间:2012-06-11 11:54:54

标签: r random dataframe reliability mean

这个问题类似于我在此处提出的问题:randomly sum values from rows and assign them to 2 columns in R

由于我遇到R问题,这个问题都与编程和统计有关。我对两者都很陌生。

我有一个data.frame,一列有219个主题。其余的列是7,并且在每行中我有一个数字,表示当暴露于实验的两个条件时该特定主题的响应时间的差异。

这是数据的外观(我使用的是head函数,否则会太长):

    > head(RTsdiff)
      subject   block3diff   block4diff   block5diff   block6diff   block7diff
    1   40002  0.076961798  0.046067460 -0.027012048  0.017920261  0.002660317
    2   40004  0.037558511 -0.016535211 -0.044306743 -0.011541667  0.044422892
    3   40006 -0.017063123 -0.031156150 -0.084003876 -0.070227149 -0.113382784
    4   40008 -0.015204017 -0.009954545 -0.004082353  0.006327839  0.022335271
    5   40009  0.006055829 -0.045376437 -0.002725572  0.016443182  0.032848128
    6   40010 -0.003017857 -0.034398268 -0.034476491  0.014158824 -0.036592982
       block8diff    block9dif
    1  0.03652273  0.037306173
    2 -0.08032784 -0.150682051
    3 -0.09724864 -0.060338684
    4 -0.04783333  0.006539326 
    5 -0.01459465 -0.067916667
    6 -0.01868126 -0.034409584

我需要的是一个代码,对于每个主题(即每一行)将采样3或4个值,平均它们,并将它们添加到新的向量(称为half1)。向量half2应该具有第一次尝试中未采样的值的平均值。

所以,假设我想创建的data.frame被称为“RTshalves”,我需要第一列是RTsdiff中相同的主题列,第二列必须在第一行中随机的平均值选定的值对应于第一个主题,第二个列必须具有第一个主题中未在第一个主题中选择的值的平均值。第2列和第3列应该具有相同的信息,但这次是对于主题2(在我的data.frame中是主题40004)等,直到达到219个主题。

假设第一个样本随机选择了主题1的3个值(block3diff,block5diff和block9diff),因此block4diff,block6diff,block7diff和block8diff的值将自动对应另一半。然后,我期望看到的(仅考虑219行中的第一行)是:

   Subject     Half1       Half2 
    40002   0.02908531   0.02579269

如果有人对此背后的统计数据感兴趣,我正在尝试进行分半可靠性测试以检查测试的一致性。理由是,如果RT平均值的差异是效果的可靠估计量,那么一个参与者的一半块的差异应该与另一半块的差异相关联。

非常感谢帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

half1很简单:编写你自己的函数来做你想要的每一行(作为向量),然后apply到行:

eachrow <- function(x) {
   mean(sample(x,2))
}
RTsdiff$half1 <- apply(eachrow,1,RTsdiff)

要获得half2,您可能希望同时执行此操作。 ddply可能是最简单的(让by参数成为你的主题变量来获取每一行)。像这样:

RTsdiff <- data.frame(subject=seq(6))
RTsdiff <- cbind( RTsdiff, matrix(runif(6*8),ncol=8) )

library(plyr)
eachrow <- function(x,n=3) {
  x <- as.numeric(x[,2:ncol(x)]) # eliminate the ID column to make things easier, make a vector
  s <- seq(length(x))
  ones <- sample(s,n) # get ids for half1
  twos <- !(s %in% ones) # get ids for half2
  data.frame( half1=mean(x[ones]), half2=mean(x[twos]) )
}
ddply( RTsdiff, .(subject), eachrow)

  subject     half1     half2
1       1 0.4700982 0.5350610
2       2 0.6173469 0.5351995
3       3 0.2245246 0.6807482
4       4 0.6330649 0.6316353
5       5 0.6388060 0.6629077
6       6 0.4652086 0.5073034

有很多更优雅的方法可以做到这一点。特别是,我使用ddply来轻松输出data.frames,以便我可以从函数中输出half1half2,并在最后将它们组合得很好,但是ddply将data.frames作为输入,因此需要稍微加工才能首先将其传递给向量。提供sapply转置的data.frame可能会更简单。