0

私は Python と JS に慣れていて、R にはかなり慣れていませんが、データ分析のために R を楽しんでいます。if/elseロジックに基づいて、データフレームに新しいフィールドを作成しようとしていて、標準/手続き型の方法でそれを実行しようとしました:

for (i in 1:nrow(df)) {
  if (is.na(df$First_Payment_date[i]) == TRUE) {
    df$User_status[i] = "User never paid"
  } else if (df$Payment_Date[i] >= df$First_Payment_date[i]) {
    df$User_status[i] = "Paying user"
  } else if (df$Payment_Date[i] < df$First_Payment_date[i]) {
    df$User_status[i] = "Attempt before first payment"
  } else {
    df$User_status[i] = "Error"
  }
}

しかし、それは非常に遅かったです。〜300万行のデータフレームでこれを実行しようとしましたが、時間がかかりすぎました。これを行う「R」の方法に関するヒントはありますか?

df$Payment_Dateおよびdf$First_Payment_dateフィールドは日付としてフォーマットされていることに注意してください。

4

4 に答える 4

2

「エラー」に初期化してから、論理インデックスを使用して列挙された条件を上書きすると、これははるかに高速になります。すべての行の if(){}else{} ステートメントはあなたを殺しています。

df$User_status <- "Error"
df$User_status[ is.na(df$First_Payment_date) ] <- "User never paid"
df$User_status[ df$Payment_Date >= df$First_Payment_date ] <- "Paying user"
df$User_status[ df$Payment_Date < df$First_Payment_date ] <- "Attempt before first payment"
于 2014-04-12T07:42:02.727 に答える
0

これにより速度が大幅に向上するかどうかはわかりませforんが、以前のループよりも改善が見られるはずです。これらelseの条件下では、 は実際には必要ありません。

また、R には、ループとして機能する関数とfor、その他の種類のループがあります。を参照してください?apply

これを試して、どのように機能するかを見てください。データがないのでテストできません。

> df$User_status[i] <- rep("Error", nrow(df)) 
      ## allocate a vector, fill it with "Error"

> sapply(seq(nrow(df)), function(i){

    if(is.na(df$First_Payment_date[i])){ 
      gsub("Error", "User never paid", df$User_status[i]) }

    if(df$Payment_Date[i] >= df$First_Payment_date[i]){
      gsub("Error", "Paying user", df$User_status[i]) }

    if (df$Payment_Date[i] < df$First_Payment_date[i]) {
      gsub("Error", "Attempt before first payment", df$User_status[i]) }

    })
于 2014-04-12T07:48:46.193 に答える
0

この種のものを処理する通常の方法は、経由ifelseです。

df$User_status <- with(df,
    ifelse(is.na(First_Payment_date), "User never paid",
    ifelse(Payment_Date >= First_Payment_date, "Paying user",
    ifelse(Payment_Date < First_Payment_date, "Attempt before first payment",
    "Error"))))
于 2014-04-12T09:46:13.480 に答える