2016-04-17 12 views
0

私は2つのデータセットTransaction_longとTransaction_shortを持っています。 Transaction_longには、データセット内の購入ポイント(trueで示される)を含むポリシーと価格の引用が多数あります。 Transaction_shortには、購入ポイントのエントリのみがあります。Rでは、2つのデータセットを繰り返し処理し、ループなしで結果を返す

私の目的は、Policy_Change_FrequencyというTransaction_shortデータセットに列を追加することです。ショートデータセット内のすべての顧客について、その長いデータセット内のその顧客の行を繰り返し、ポリシーが変更された時間を計算します。

私は合計を使用することができるポリシーの変更(差分(Transaction_Long $ポリシー)= 0を!)を見つけるためにではなく、これらの二つのデータセットを反復処理し、結果

詳細を取得する方法がわから:

Customer_Name : name of customer 
Customer_ID: Customer Identifier number 
Purchase: Boolean variable (Yes-1,No-0) 
Policy: Categorical (takes values 1-5) 
Price : Price quoted 
Data set1-Transaction_Long 

Customer_Name,Customer_ID,Purchased,Policy,Price 
Joe,101,0,1,500 
Joe,101,0,1,505 
Joe,101,0,2,510 
Joe,101,0,2,504 
Joe,101,0,2,507 
Joe,101,0,1,505 
Joe,101,1,3,501 
Mary,103,0,1,675 
Mary,103,0,3,650 
Mary,103,0,2,620 
Mary,103,0,2,624 
Mary,103,0,2,630 
Mary,103,1,2,627 

Data set 2:Transaction_Short 
Customer_Name , Customer_ID,Purchased,Policy, Price 
Joe,101,1,3,501 
Mary,103,1,2,627 

私の最後のTranscation短いデータセットが

のような最終的なデータセットは、この

0のようになりますになりますので、取引ショートデータセット内のポリシーの変更頻度の列を追加する必要があります

答えて

0

各顧客の前の行からの変更に1つのタグを付けるポリシー変更の計算列を考えてみましょう。それから、カウントのために1を集計します。

Transaction_Long$PolicyChangedFreq <- sapply(1:nrow(Transaction_Long), 
            function(i) 
            if (i > 1) { 
             ifelse(Transaction_Long$Policy[i-1]== 
               Transaction_Long$Policy[i], 0, 
               ifelse(Transaction_Long$Customer_ID[i-1] != 
                Transaction_Long$Customer_ID[i], 0, 1)) 
            } else { 0 } 
            ) 

Transaction_Final <- merge(aggregate(.~ Customer_ID + Customer_Name, 
            Transaction_Long[,c(1:5)], FUN = tail, n = 1), 
          aggregate(.~ Customer_ID + Customer_Name, 
            Transaction_Long[,c(1:2,6)], FUN = sum), 
          by = c('Customer_ID', 'Customer_Name')) 
Transaction_Final 
# Customer_ID Customer_Name Purchased Policy Price PolicyChangedFreq 
#1   101    Joe   1  3  501     3 
#2   103   Mary   1  2  627     2 
0

@Parfait:マージを伴う必要な2件の集計(各顧客とPolicyChangedカウントのための最終行)に使用されます。解決していただきありがとうございます。私は長いデータセットでは約500K行を有し、約100K短いdataset..thisそこにない他のソリューションをwhile..isを取っているので、私はR

for (i in 1:nrow(Transaction_short)){ 
sql <- sprintf("SELECT policy from Transaction_long where customer_ID = %s",ML_Train_short$customer_ID[i]) 
df<- sqldf(sql) 
NF <- sum(df$policy[-1]!= df$policy[-length(df$policy)]) 
ML_Train_short$Policy_Change_Freq[i] <- NF 
} 

でsqldfパッケージを使用して、これを解きますループが必要ですか?ありがとうございます

関連する問題