0

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

id<-c(1,2,3,4)
date<-c("23-01-08","01-11-07","30-11-07","17-12-07")
df<-data.frame(id,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")

私のテーブルの4番目の列で、日付に基づいてデータを調整して有効に分割したいので、日付<= 2007-12-16の場合、4番目の列はcalibそうでなければなりませんvalid

次の行を書きました。

for ( i in 1:4)
if (df[i,3]<=2007-12-16)(df[i,4]="calib")else (df[i,4]="valid")

最初の問題は、このコマンドを実行すると 4 列目のすべてのセルになっvalidてしまい、日付条件を適切に処理できないように見えることです。私の最初の質問は、どうすればこの問題を解決できるかということです。

2 番目の問題は、実際のデータ フレームに 600000 行あり、このコマンドの実行に数時間かかることです。このコマンドをより速く、完全な CPU 容量で実行する方法があるかどうか疑問に思います。

ありがとうございました!

4

1 に答える 1

5

Rはベクトル化されているため、1つのステートメントでそれを実行できます。

R> df <- within(df,state <- ifelse(date2<=as.Date("2007-12-16"),"calib","valid"))
R> df
  id     date      date2 state
1  1 23-01-08 2008-01-23 valid
2  2 01-11-07 2007-11-01 calib
3  3 30-11-07 2007-11-30 calib
4  4 17-12-07 2007-12-17 valid
R> 

within、、withまたは奇妙に思われる場合は、transform直接行うこともできます。

R> df$state <- ifelse(df$date2<=as.Date("2007-12-16"),"calib","valid")
R> df
  id     date      date2 state
1  1 23-01-08 2008-01-23 valid
2  2 01-11-07 2007-11-01 calib
3  3 30-11-07 2007-11-30 calib
4  4 17-12-07 2007-12-17 valid
R> 
于 2012-08-25T03:44:10.477 に答える