1

我有一个包含购买数据的数据集,我一直在试图弄清楚一些事情。在开始之前,我的数据如下所示:

> 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 的记录匹配。

4

1 回答 1

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), ]
于 2014-01-29T18:18:43.950 回答