2016-05-02 6 views
1

私は、フォルダ内のすべてのファイルに対して2つのループを繰り返すのに苦労しています。私は600個以上の.csvファイルを持っています。このファイルには、文章中に作成されたサッカードの潜伏時間と持続時間に関する情報が含まれています。私は、各サッカードの開始と終了ポイントを計算し、開始と終了と呼ばれる2つの新しい列を作成する、ファイルのそれぞれについてRフォルダ内のすべてのファイルに対してループを反復する方法は?

order subject sentence latency duration 
1  1  1   641  76 
2  1  1   98  57 
3  1  1   252  49 
4  1  1   229  43 

:彼らはこのようになります。それぞれの値は、待ち時間と期間の列の値から計算されます。

SentFile = read.csv(file.choose(), header = TRUE, sep = ",") 

# Calculate Start 
for (i in 1:(nrow(SentFile)-1)){ 
    SentFile$Start[1] = SentFile$Latency[1] 
    SentFile$Start[i+1] = SentFile$Start[i] + 
    SentFile$Duration[i] + SentFile$Latency[i+1]} 

#Calculate End 
for (i in 1:(nrow(SentFile)-1)){ 
    SentFile$End[i] = SentFile$Start[i] + SentFile$Duration[i]} 

をそしてその結果は、次のようになります:私はそうのように、各ファイルのループを使用してこれを行うことができ、私はそれを行うためのより効率的な方法は、おそらくそこにあると確信しています

order subject sentence latency duration Start End 
1  1  1   641  76  641 717 
2  1  1   98  57  815 872 
3  1  1   252  49  1124 1173 
4  1  1   229  43  1402 1445 

、ループで指定された正確なセルを使用して開始値と終了値を計算することは非常に重要です。これは、個々のファイルごとに動作させるために考えられる唯一の方法でした。

私が言ったように、600以上のファイルがあり、セット全体の開始値と終了値を計算し、各ファイルに新しい列を追加できるようにします。

sent_files = list.files() 
lapply(sent_files, function(x){ 
SentFile = read.csv(x, header = TRUE, sep = ",") 

for (i in 1:(nrow(SentFile)-1)){ 
    SentFile$Start[1] = SentFile$Latency[1] 
    SentFile$Start[i+1] = SentFile$Start[i] + SentFile$Duration[i] 
    + SentFile$Latency[i+1]} 

    #Calculate End of Saccade Absolute Time Stamp ####### 
for (i in 1:(nrow(SentFile)-1)){ 
    SentFile$End[i] = SentFile$Start[i] + SentFile$Duration[i]}}) 

しかし、私はこのエラーメッセージ取得しておく::私はこのような、lapply使用してみました、私はこれが動作するようになってで任意の助けを本当に感謝

Error in `$<-.data.frame`(`*tmp*`, "SacStart", value = c(2934L, NA)):replacement has 2 rows, data has 1 

を!

+2

はベクトルとして 'latency'と' duration'を取り、多分いくつかの項目を 'cumsum' –

+1

を使用しますsent_filesのあなたが期待どおりに動作しません。これをテストするには、 '' for''ループ(ここではインデックスx)と '' print(x) ''を作ることができます。次に、どのファイルが問題を引き起こしているかを知っています。次に、ファイルごとの分析またはエラーを引き起こす個々のファイルを確認して更新する必要があります。 – Phann

答えて

1

まず、forループを置き換える:

data <- data.frame(
    "order" = c(1,2,3,4), subject = c(1,1,1,1), sentance = c(1,1,1,1), latency= c(641, 98, 252, 229), duration = c(76, 57, 49, 43) 
) 

data$end <- cumsum(data$latency + data$duration) 
data$start <- data$end - data$duration 

は第二に、あなたはあなたの環境変数にCSV負荷の結果を割り当てていません。

あなたが一度にあるすべてのファイルを処理したい場合は、これにデータロード用のコードを変更:

data.list <- lapply(sent_files, function(x){ 
data <- read.csv(x, header = TRUE, sep = ",") 
return(data) 
}) 
data <- do.call("rbind", data.list) 
+1

ありがとう、それは私の問題を解決! – user2711113

関連する問題