3

私はRとこのリストに不慣れです。次の質問があまりにも基本的または情報不足でないことを願っています。過去数時間、アーカイブをチェックインしていましたが役に立たなかったので、ここに投稿します。問題の一部は、必要な機能を参照するときに使用する適切な用語を正確に知らないことです。これにより、検索が困難になる可能性があります。そうは言っても、ここに私が解決する必要があるものがあります:

次のようなデータフレームがあります。

   Subject Item Region   RT  
13     102    1  R1 1245  
14     102    4  R1 1677  
15     102    7  R1 1730  
25     103    1  R1  815  
26     103    4  R1  828  
27     103    7  R1  985  
1489     102    1  R2 356  
1490     102    4  R2 510  
1491     102    7  R2 544  
1501     103    1  R2 447  
1502     103    4  R2 486  
1503     103    7  R2 221  
...  

各被験者には、1 つの項目の複数の領域に対する RT (反応時間) があります。そして、各被験者は複数のアイテムを見ます。

外れ値を計算してから正規化したいと考えています (ただし、このスレッドではその解決策について心配するつもりはありません)。最初のステップとして、いくつかの単純な関数を使用して、各被験者の各地域の平均と SD を計算し、項目全体をまとめました (つまり、(被験者がその地域で持っているすべての RT の平均):

Mean = with(test, aggregate(RT, by = list(Subject,Region),mean, na.rm=TRUE))  
SD = with(test, aggregate(RT, by = list(Subject,Region),sd, na.rm=TRUE))  

次に、cbind を使用して名前を変更し、すべてのデータを 1 つのデータフレームにまとめました。

Subject Region      Mean         SD  
1       102  R1 1143.7778  202.25530  
2       102  R2  431.8611  125.84393  
9       103  R1  923.0833  179.51098  
10      103  R2  344.1667  146.51192  
...  

問題は、すべての手段を各被験者の正しい領域に関連付ける必要があることです。つまり、次のような出力を生成したいと思います (すべてのサブジェクト 102 領域 R1 の平均値と SD は同じですが、RT が異なることに注意してください)。

Subject Item Region   RT Mean         SD  
13     102    1  R1 1245 1143.7778  202.25530  
14     102    4  R1 1677 1143.7778  202.25530  
15     102    7  R1 1730 1143.7778  202.25530  
25     103    1  R1  815 923.0833  179.51098  
26     103    4  R1  828 923.0833  179.51098  
27     103    7  R1  985 923.0833  179.51098  
1489     102    1  R2 356 431.8611  125.84393   
1490     102    4  R2 510 431.8611  125.84393  
1491     102    7  R2 544 431.8611  125.84393  
1501     103    1  R2 447 344.1667  146.51192  
1502     103    4  R2 486 344.1667  146.51192  
1503     103    7  R2 221 344.1667  146.51192  

merge と cbind は、ある値を別の値に拡張して一致させるという仕事をしないようです。おそらく、メルトやキーを使用する機能を利用する必要がありますか?

私が自分でこれを試すことができるように、誰かが私に関連する機能を教えてくれることを願っています.

読んでくれてありがとう...

4

4 に答える 4

3

パッケージのddply関数を使用して、このタスクを実行できます。plyr使用ddplyave機能:

test <- read.table(text="
Subject Item Region   RT  
13     102    1  R1 1245  
14     102    4  R1 1677  
15     102    7  R1 1730  
25     103    1  R1  815  
26     103    4  R1  828  
27     103    7  R1  985  
1489     102    1  R2 356  
1490     102    4  R2 510  
1491     102    7  R2 544  
1501     103    1  R2 447  
1502     103    4  R2 486  
1503     103    7  R2 221", header=T)

library(plyr)
ddply(test, .(Subject, Region), transform, Mean=ave(RT), SD=ave(RT, FUN=sd))
   Subject Item Region   RT      Mean        SD
1      102    1     R1 1245 1550.6667 266.03822
2      102    4     R1 1677 1550.6667 266.03822
3      102    7     R1 1730 1550.6667 266.03822
4      102    1     R2  356  470.0000 100.17984
5      102    4     R2  510  470.0000 100.17984
6      102    7     R2  544  470.0000 100.17984
7      103    1     R1  815  876.0000  94.62029
8      103    4     R1  828  876.0000  94.62029
9      103    7     R1  985  876.0000  94.62029
10     103    1     R2  447  384.6667 143.07457
11     103    4     R2  486  384.6667 143.07457
12     103    7     R2  221  384.6667 143.07457

aggregateすでに行ったように、関数を使用して結果を確認できます。

> with(test, aggregate(RT, by = list(Subject,Region),mean, na.rm=TRUE))  
  Group.1 Group.2         x
1     102      R1 1550.6667
2     103      R1  876.0000
3     102      R2  470.0000
4     103      R2  384.6667
> with(test, aggregate(RT, by = list(Subject,Region),sd, na.rm=TRUE))
  Group.1 Group.2         x
1     102      R1 266.03822
2     103      R1  94.62029
3     102      R2 100.17984
4     103      R2 143.07457

ご覧のとおり、 によって集計された平均と sd の両方がSubject( )Regionに入れられます。data.frametest

編集

に対処したい場合NAは、次の編集されたコードを使用することをお勧めします。

ddply(test, .(Subject, Region), transform, 
      Mean=ave(RT, FUN = function(x) mean(x, na.rm=TRUE)),
      SD=ave(RT, FUN=function(x) sd(x, na.rm=TRUE)))
于 2012-08-16T14:17:00.457 に答える
3

これは次を使用して行うことができますsqldf

df1<-read.table(header=T,text="Subject Item Region   RT  
13     102    1  R1 1245  
14     102    4  R1 1677  
15     102    7  R1 1730  
25     103    1  R1  815  
26     103    4  R1  828  
27     103    7  R1  985  
1489     102    1  R2 356  
1490     102    4  R2 510  
1491     102    7  R2 544  
1501     103    1  R2 447  
1502     103    4  R2 486  
1503     103    7  R2 221")

df2<-read.table(header=T,text="Subject Region      Mean         SD  
1       102  R1 1143.7778  202.25530  
2       102  R2  431.8611  125.84393  
9       103  R1  923.0833  179.51098  
10      103  R2  344.1667  146.51192")  

library(sqldf)
sqldf("SELECT df1.*,df2.Mean,df2.SD from df1,df2
        WHERE df1.Region=df2.Region 
         GROUP BY df1.Region,df1.Subject,df1.Item")

#   Subject Item Region   RT      Mean       SD
#1      102    1     R1 1245 1143.7778 202.2553
#2      102    4     R1 1677 1143.7778 202.2553
#3      102    7     R1 1730 1143.7778 202.2553
#4      103    1     R1  815 1143.7778 202.2553
#5      103    4     R1  828 1143.7778 202.2553
#6      103    7     R1  985 1143.7778 202.2553
#7      102    1     R2  356  431.8611 125.8439
#8      102    4     R2  510  431.8611 125.8439
#9      102    7     R2  544  431.8611 125.8439
#10     103    1     R2  447  431.8611 125.8439
#11     103    4     R2  486  431.8611 125.8439
#12     103    7     R2  221  431.8611 125.8439

地域、件名、アイテムの順に並べられています

于 2012-08-17T02:31:41.250 に答える
2

あなたの仕事は 99% 終わりました。aggregate()あなたがしなければならなかった唯一のことは、より丁寧に動作するように出力を「きれいにする」ことでしたmerge(). 以下では、簡単にマージできるように出力列名を指定していることに注意してください。

次に、Reduce()再帰的にマージします。

Mean = with(test, aggregate(list(mean = RT), 
                            by = list(Subject = Subject, Region = Region), 
                            mean, na.rm=TRUE))
SD = with(test, aggregate(list(sd = RT), 
                          by = list(Subject = Subject, Region = Region), 
                          sd, na.rm=TRUE))
Reduce(function(x, y) merge(x, y), list(test, Mean, SD))
#    Subject Region Item   RT      mean        sd
# 1      102     R1    1 1245 1550.6667 266.03822
# 2      102     R1    4 1677 1550.6667 266.03822
# 3      102     R1    7 1730 1550.6667 266.03822
# 4      102     R2    1  356  470.0000 100.17984
# 5      102     R2    4  510  470.0000 100.17984
# 6      102     R2    7  544  470.0000 100.17984
# 7      103     R1    1  815  876.0000  94.62029
# 8      103     R1    4  828  876.0000  94.62029
# 9      103     R1    7  985  876.0000  94.62029
# 10     103     R2    1  447  384.6667 143.07457
# 11     103     R2    4  486  384.6667 143.07457
# 12     103     R2    7  221  384.6667 143.07457
# merge(merge(test, Mean), SD)
于 2012-08-16T16:49:06.223 に答える
1

それは一種のブルートフォースですが、うまくいきます

test <- data.frame(Subject=rep(c(102,103),2,each=3), Item=rep(c(1,4,7),4),Region=rep(c("R1","R2"),each=6), RT= c(1245,1677,1730,815,828,985,356,510,544,447,486,221))

Mean = with(test, aggregate(RT, by = list(Subject,Region),mean, na.rm=TRUE))  
SD = with(test, aggregate(RT, by = list(Subject,Region),sd, na.rm=TRUE))  

aa <- data.frame(test, Mean=0, SD=0)

for (i in 1:nrow(aa)) {
  for(j in 1:nrow(Mean)){
    if (aa$Subject[i]==Mean$Group.1[j] & aa$Region[i]==Mean$Group.2[j]) aa$Mean[i] <- Mean$x[j]
    if (aa$Subject[i]==SD$Group.1[j] & aa$Region[i]==SD$Group.2[j]) aa$SD[i] <- SD$x[j]
  }
}
于 2012-08-16T14:18:43.493 に答える