2017-06-09 3 views
1

親愛なるStack Overflow'ers、大きなデータセットのRでのループ、より良い方法?

現在、私は1447499行の33列のデータセットを持っています。

今、私は私が手動で最初のタイムスタンプを作成し、その後5(ミリ秒)を追加する必要がありました

(Unixタイムスタンプは、33番目の列にある日付に基づいて)新しいデータで1つの新しい列を追加したいですタイムスタンプになるたびに、以下のコードが役立ちますか?

# Data loading is fine 
PhoneSensorData$UnixTimestamp <- 0 
lengte = nrow(PhoneSensorData) 
PhoneSensorData$UnixTimestamp[1] = 1496944482155 

for (i in 1:lengte) { 
    PhoneSensorData$UnixTimestamp[i] = 1496944482155 + (5*i) 
} 

しかし、これは年齢のために実行される(あるいは、今はほとんど時間を完了していない) 私が何か間違ったことをやっている、またはより良い方法があります:私はこれまで何

その後、私は再びcsvにエクスポートしなければなりません。 データのロードにはフリーダで約10-15秒かかるので、問題ありません。

ありがとうございます!

答えて

1

これは、道より高速ベクトル化のおかげで次のようになります。

PhoneSensorData$UnixTimestamp = 1496944482155 + (5*(1:lengte)) 

あなたが列を追加するので、非常に多くの物事をスピードアップし、そのファイルのすべての行を書き換えることはできません保存して。ここでのボトルネックはファイルシステムです。

+0

これは私のために働いた!ありがとう、私の時間を大切に保存しました:) – JeBo

1

Rでは、新しい列を作成/編集するためにforループを使用しないでください。 これらはベクトルベースの操作であり、Rはベクトルベースの操作で実際に優れています。 data.tableで

、あなたはこれらのコードでそれを行うことができます。

library(data.table) 
PhoneSensorData <- data.table(PhoneSensorData) 
PhoneSensorData[, RowNumber := 1:.N] 
PhoneSensorData[, UnixTimeStamp := 1496944482155 + RowNumber * 5 ] 
fwrite(PhoneSensorData, file="PhoneSensorData.csv") 

PS:data.tableの関数fwriteも本当に速いです。私はそれを使用することをお勧めします。

+0

あなたは '.I'の代わりに、' RowNumber'を生成を使用することができ、メモリを節約し、おそらく少し時間がかかる。 – snaut

0

標準的なデータのシーケンス(文字列、数値、日時のいずれであっても)を作成するには、標準のR seq関数を使用できます。

それは引数fromを指定して、あなたの場合は、bylength.outあなたの目標を達成するための最も便利な方法です:

PhoneSensorData$UnixTimestamp <- 
      seq(from = 1496944482155, by = 5, length.out = nrow(PhoneSensorData)) 
+0

詳細なフォーマット済みの回答を提供してください。 – Masoud

関連する問題