【问题标题】:Indexing customer transactions in R [duplicate]在R中索引客户交易[重复]
【发布时间】:2013-08-30 16:48:08
【问题描述】:

我想在 R 数据框中为客户交易编制索引,以便我可以轻松识别特定客户进行的第三笔交易。例如,如果我有以下数据框(按客户和交易日期排序):

transactions = data.frame(CUST.ID = c(1, 1, 2, 2, 2, 2, 3, 3, 3), 
DATE = as.Date(c("2009-07-02", "2013-08-15", "2010-01-02", "2004-03-05", 
"2006-02-03", "2007-01-01", "2004-03-05", "2006-02-03", "2007-01-01")),
AMOUNT = c(5, 9, 21, 34, 76, 1, 100, 23, 10))



> transactions
  CUST.ID       DATE AMOUNT
1       1 2009-07-02      5
2       1 2013-08-15      9
3       2 2010-01-02     21
4       2 2004-03-05     34
5       2 2006-02-03     76
6       2 2007-01-01      1
7       3 2004-03-05    100
8       3 2006-02-03     23
9       3 2007-01-01     10

我可以清楚地看到客户 1 进行了 2 笔交易,客户 2 进行了 4 笔交易,以此类推。

我想要按客户索引这些交易,在我的数据框中创建一个新列。下面的代码实现了我想要的:

transactions$COUNTER = 1
transactions$CUSTOMER.TRANS.NO = unlist(aggregate(COUNTER ~ CUST.ID, 
data = transactions, 
function(x) {rank(x, ties.method = "first")})[, 2])
transactions$COUNTER = NULL


> transactions
  CUST.ID       DATE AMOUNT CUSTOMER.TRANS.NO
1       1 2009-07-02      5                 1
2       1 2013-08-15      9                 2
3       2 2010-01-02     21                 1
4       2 2004-03-05     34                 2
5       2 2006-02-03     76                 3
6       2 2007-01-01      1                 4
7       3 2004-03-05    100                 1
8       3 2006-02-03     23                 2
9       3 2007-01-01     10                 3

现在每个客户的第一笔交易标记为 1,第二笔交易标记为 2,依此类推。

所以我得到了我想要的,但它是如此可怕的一段代码,创建一个列表并分离,它是如此丑陋。有没有比我更有经验的人能想出更好的解决方案?

【问题讨论】:

    标签: r indexing dataframe


    【解决方案1】:

    因为您已尽力发布您尝试过的示例代码(使您的问题成为比我链接到的副本更好的 Stack Overflow 问题),所以我将在此处总结选项:

    ave

    within(transactions, { Trans.No <- ave(CUST.ID, CUST.ID, FUN = seq_along) })
    

    getanID

    library(splitstackshape)
    getanID(transactions, "CUST.ID")
    

    rle

    ## Depends on your data being sorted
    transactions$Trans.No <- sequence(rle(transactions$CUST.ID)$lengths)
    

    data.table

    library(data.table)
    DT <- data.table(transactions)
    DT[, .id := sequence(.N), by = "CUST.ID"]
    

    【讨论】:

    • 感谢您的帮助,很抱歉发布重复的问题。我想使用 ave 函数,但找不到按 CUST.ID 和 DATE 分组的方法。显然,如果对数据框进行了排序,它将起作用,但现在我变得贪婪并且想索引未排序的数据。
    • @user2733680,ave 函数应该适用于未排序的数据。 rle 不起作用,因为它旨在确定 运行长度
    • @user2733680,发重复问题也没问题。它只是被标记为这样,并有助于作为其他寻求解决类似问题的人的路标。尽量不要太频繁:)
    【解决方案2】:
    library(plyr)
     ddply(transactions,.(CUST.ID),transform,CUSTOMER.TRANS.NO=seq(1,length(CUST.ID),1))
      CUST.ID       DATE AMOUNT CUSTOMER.TRANS.NO
    1       1 2009-07-02      5                 1
    2       1 2013-08-15      9                 2
    3       2 2010-01-02     21                 1
    4       2 2004-03-05     34                 2
    5       2 2006-02-03     76                 3
    6       2 2007-01-01      1                 4
    7       3 2004-03-05    100                 1
    8       3 2006-02-03     23                 2
    9       3 2007-01-01     10                 3
    

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      相关资源
      最近更新 更多