交易数据

时间:2014-01-29 13:48:30

标签: r duplicate-removal set-intersection

我有一个包含购买数据的数据集,而我却想要解决一些问题。在进入它之前,这是我的数据:

> df.f[df.f$CUST_ID == badIDs[1], c(1, 20, 4, 11, 13)]

CUST_ID CI2_TRANS_DT HR_SID NDS_AMT PROD_NUM
   1    2013-12-14     10    0.00    a5g4324
   1    2013-12-14     10    0.00    k4jn42k
   1    2013-12-14     10    0.00  f3ft52f3
   1    2013-12-14     10    0.00    f454fn
   1    2013-12-14     10    0.00    l2k41m
   1    2013-12-14     10    2.25  nb24b2x3
   1    2013-12-14     10    0.00    k1s4m6
   1    2013-12-14     10    0.00    1z34fl
   1    2013-12-14     10    0.95  f3ft52f3
   1    2013-12-17      6    4.45    v0d45j
   1    2013-12-17      6    0.00    a5g4324
   1    2013-12-17      6    4.75  g6b673va
   1    2013-12-17      6    0.00    f454fn
   1    2013-12-19      7   -4.75  bh431d11
   1    2013-12-20      6    4.75  bh431d11
   2    2013-12-14      6    4.75  g6b673va
   2    2013-12-15      6    3.75  nb24b2x3
   2    2013-12-15      6   -3.75  nb24b2x3
   2    2013-12-16      6    5.90  bh431d11

上述变量是该订单中的客户ID号,交易日期,一天中的小时数,销售金额和产品编号。我遇到的问题是NDS_AMT的负值。如果值为负,我需要检查是否有相应的购买,如果有,则负值可以保留。如果没有相应的购买,那么我需要从我的数据中删除该记录。例如,需要删除倒数第二个记录,因为它是否定的,并且在同一天没有相应的购买。第二天就购买了同样的产品,但由于他们有两次不同的访问,因此不能算作相应的购买。

我已经尝试过考虑如何做到这一点,并考虑了嵌入式应用函数,交叉函数或复制函数,但无论函数如何,我都无法掌握如何编写代码。任何帮助将不胜感激。

编辑:根据Henrik的请求,我为数据中添加了四个新行,这些新行的NDS_AMT为负,其中记录保留在数据中。 “相应购买”的条件是CUST_ID,CI2_TRANS_DT,HR_SID和PROD_NUM值必须全部与NDS_AMT小于0的记录匹配。

1 个答案:

答案 0 :(得分:0)

所以这是我提出的解决方案。显然,您可以根据需要随意提出调整建议。

refundRecords <- df.f[df.f$NDS_AMT < 0, ]
refundRecords$NDS_AMT <- refundRecords$NDS_AMT * -1
dups <- apply(refundRecords, 1, function(x) apply(df.f[df.f$CUST_ID == x[1], ], 1, function(y) sum(x %in% y)))
id2check <- sapply(dups, function(x) any(x == 5))
badIDs <- unique(df.f$CUST_ID[rownames(df.f) %in% names(id2check[!id2check])])
df.f <- df.f[df.f$NDS_AMT >= 0 | !(df.f$CUST_ID %in% badIDs), ]