【问题标题】:In R, iterating over two datasets and getting back results without looping在 R 中,迭代两个数据集并在不循环的情况下返回结果
【发布时间】:2016-04-17 12:09:22
【问题描述】:

我有两个数据集,Transaction_long 和 Transaction_short。 Transaction_long 在数据集中有许多带有购买点(用 true 表示)的政策和价格报价。 Transaction_short 只有购买点的条目。

我的目标是在 Transaction_short 数据集中添加一个名为 Policy_Change_Frequency 的列。对于短数据集中的每个客户,迭代长数据集中该客户的行并计算策略更改的次数。

要找到策略更改,我可以使用 sum(diff(Transaction_Long$policy)!=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

需要在 Transaction Short Dataset 中添加 Policy Change Frequency 列,所以我最终的 Transcation short Dataset 会是这样的

最终数据集应如下所示

Customer_Name , Customer_ID,Purchased, Policy, Price,Policy_ChangeFreq 
Joe,101,1,3,501,3
Mary,103,1,2,627,2

【问题讨论】:

    标签: r loops


    【解决方案1】:

    考虑策略更改的计算列,其中标记从每个客户中的前一行更改为一个。然后,汇总这些以进行计数。由于需要两个聚合(每个客户的最后一行和PolicyChanged 计数),因此使用了合并:

    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
    

    【讨论】:

      【解决方案2】:

      @芭菲。谢谢你的解决方案。我使用 R 中的 sqldf 包解决了这个问题

      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
      } 
      

      因为我在长数据集中有大约 500K 行,在短数据集中有大约 100K..这需要一段时间..还有其他不需要循环的解决方案吗?谢谢

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2016-05-28
        • 1970-01-01
        • 2019-06-17
        • 2022-08-24
        相关资源
        最近更新 更多