1

私は複数のデータ ファイルを持っており、そのファイルをクリーンアップして、反復測定 ANOVA を実行するための手段を取得することに関心があります。

これがサンプルデータです。実際のデータには4500行があり、Actresponseと呼ばれる別の行には9が含まれていることがあります。

plyr と、それがデータを操作するのにいかに優れているかを発見したばかりですが、現在の使用方法はかなりばかげているように見えます。データ フレームに読み込みたいと考えている 4 つの異なるものがあります。それらを 4 つの個別のデータ フレームに読み込んで開始しました。これを組み合わせてすべてを読み取る方法があるかどうか疑問に思っています。より少ないコード行で 1 つのデータ フレーム (各ファイルの各 reqresponse の行) への手段. 基本的に、同じコードを 4 回書き直すことなく、ここで行ったことを達成できますか?

 PMScoreframe <- lapply(list.files(pattern='^[2-3].txt'),function(ff){
  data <-  read.table(ff, header=T, quote="\"")
  data <- data[-c(seq(from = 1, to = 4001, by=500), seq(from = 2, to = 4002, by=500)), ]
  ddply(data[data$Reqresponse==9,],.(Condition,Reqresponse),summarise,Score=mean(Score)) 
})

PMRTframe <- lapply(list.files(pattern='^[2-3].txt'),function(ff){
 data <-  read.table(ff, header=T, quote="\"")
 data <- data[data$RT>200,]
  data <-  ddply(data,.(Condition),function(x) x[!abs(scale(x$RT)) > 3,])
 ddply(data[data$Reqresponse==9,],.(Condition,Reqresponse,Score),summarise,RT=mean(RT))
})

OtherScoreframe <- lapply(list.files(pattern='^[2-3].txt'),function(ff){
  data <-  read.table(ff, header=T, quote="\"")
 data <- data[-c(seq(from = 1, to = 4001, by=500), seq(from = 2, to = 4002, by=500)), ]
  select <- rep(TRUE, nrow(data))
  index <- which(data$Reqresponse==9|data$Actresponse==9|data$controlrepeatedcue==1)
  select[unique(c(index,index+1,index+2))] <- FALSE
  data <- data[select,]
 ddply(data[data$Reqresponse=="a"|data$Reqresponse=="b",],.     (Condition,Reqresponse),summarise,Score=mean(Score)) 
})

 OtherRTframe <- lapply(list.files(pattern='^[2-3].txt'),function(ff){
  data <-  read.table(ff, header=T, quote="\"")
  data <- data[-c(seq(from = 1, to = 4001, by=500), seq(from = 2, to = 4002, by=500)), ]
  select <- rep(TRUE, nrow(data))
  index <- which(data$Reqresponse==9|data$Actresponse==9|data$controlrepeatedcue==1)
  select[unique(c(index,index+1,index+2))] <- FALSE
  data <- data[select,]
  data <- data[data$RT>200,]
  data <-  ddply(data,.(Condition),function(x) x[!abs(scale(x$RT)) > 3,])
  ddply(data[data$Reqresponse=="a"|data$Reqresponse=="b",],.(Condition,Reqresponse,Score),summarise,RT=mean(RT))
 })
4

1 に答える 1

2

これはあなたがやろうとしていることを扱っていると思います。基本的には、一度にすべてのデータを読み込んでから対処する必要があると思いますdata.framedata.frameすべてを読み取る方法についてはいくつかの質問があります。これを行う方法は次のとおりです。そのため、グループ化にも使用できる、の各行がどのファイルから来たかの記録を保持します。

filenames <- list.files(".", pattern="^[2-3].txt")
import <- mdply(filenames, read.table, header = T, quote = "\"")
import$file <- filenames[import$X1]

これで、すべてのファイルが含まれる大きなデータフレームになりますimport(ファイルを読み取るためのパターン認識などが正しいと仮定しています)。その後、任意の基準に基づいて要約を作成できます。

上記のコードの 3 行目で何を達成しようとしているのかわかりませんが、そのddply下では、次のことを行う必要があります。

ddply(import[import$Reqresponse==9,],.(Condition,Reqresponse,file),summarise,Score=mean(Score)) 

コードの残りの部分で多くのことが行われているため、必要なものを正確に理解するのは困難です。

重要なことは、これを効率的で簡単に実行できるようにするために、データを一度に読み取ってから、そのデータセットで作業する必要があることです。必要に応じてサブセットを作成し、統計の要約などを行います。

これをどのように処理できるかの例として、次の 2 つの試行 (行?) を処理するという問題に対処する試みをreqresponse == 9次に示します。これをより効率的に行う方法はおそらくありますが、これは、より大きなデータフレームを操作する方法を簡単に示すために、どのように行っていたかに少し基づいています。各ファイルの最初の 2 つの試行を削除するように変更されました。

  import.clean <- ddply(import, .(file), function(x) {
   index <- which(x$reqresponse == 9)
   if(length(index) > 0) {
     index <- unique(c(index, index + 1, index + 2, 1, 2))
   }
   else index <- c(1,2)
   x <- x[-index,]
   return(x)
})
于 2013-03-18T03:08:53.253 に答える