根据其他列与df中其他行的关系更改一行中的df列值

用户名

在R 3.1.1中工作。

我有一个包含交易数据的数据集。每个客户至少购买了两次(我已经细分了原始数据)。我想做的是将每笔交易标记为“首次购买者”交易或“重复购买者”交易。问题是,我想将“重复购买者交易”定义为过去交易的特定时间范围内的交易,因此它并不像将每个客户的第一个交易标记为“第一个”,而将其余的标记为“第一个”那样简单“重复”。如果客户超过一年没有购物(52.25周,我希望他/她被视为首次!)

我认为,实现这一目标的最好方法是效率极低(完全公开,仍在运行,因此启动可能是错误的)。我正在使用嵌套的循环... :(

关于如何更有效地完成此操作的任何建议?在此先感谢您的帮助和建议!整个代码都带有注释,所以我会让它自己说出来,但是如果不清楚,请告诉我!

#let's ensure the repdata is ordered by date first
attach(repdata)
repdata <- repdata[order(date),] 
detach(repdata)
  
#now, we loop through repdata and decide whether purchase 
#is a first time or repeat buyer

#setting time frame to 1 year (52.25 weeks as we use week as units below)
timeframe = 52.25
#add new column to repdata that we will use below
repdata$rpt52wk <- ""

#for each row in repdata, do the following
for(i in seq_along(repdata$date)) 
{
  #assume that this is a first purchase; set rpt52wk var for [i] to "FIRST TIME BUYER"
  repdata$rpt52wk[i] = "FIRST TIME BUYER"
  
  #look at all previous transactions 
  #we can ignore higher indexed transactions (we sorted the data, ascending by date)
  for (j in seq_along(repdata$date[1:(i-1)]))
  {
    #if a transaction is found in which the same member bought within the timeframe
   else if(repdata$MEMBER_ID[i] == repdata$MEMBER_ID[j] & 
         (difftime(repdata$date[i],repdata$date[j],units="weeks")<timeframe))
    {
      #then this is a repeat buyer; set rpt var for [i] appropriately
      repdata$rpt52wk[i]="REPEAT BUYER"
    }
  }
}

添加失败的测试数据,至少在到目前为止介绍的两种解决方案都可以支持的情况下。

MEMBER_ID       date
      1 2011-04-13
      2 2011-04-22
      3 2011-04-17
      3 2011-04-26
      4 2011-04-13
      4 2011-04-16
      4 2011-04-16
      5 2011-04-20
      5 2011-04-13
      5 2011-04-18
      6 2011-04-13
      7 2011-04-13
      8 2011-04-25
      8 2011-04-20
      9 2011-04-14
     10 2011-04-14
     11 2011-04-18
     12 2011-04-15
     13 2011-04-15
     14 2011-04-13

#TEST SET GENERATION:
library(lubridate)
MEMBER_ID <- c(1,2,3,3,4,4,4,5,5,5,6,7,8,8,9,10,11,12,13,14)
date <- ymd(c("2011-04-13 UTC", "2011-04-22 UTC", "2011-04-17 UTC", "2011-04-26 UTC", 
          "2011-04-13 UTC", "2011-04-16 UTC", "2011-04-16 UTC", "2011-04-20 UTC", 
          "2011-04-13 UTC", "2011-04-18 UTC", "2011-04-13 UTC", "2011-04-13 UTC", 
          "2011-04-25 UTC", "2011-04-20 UTC", "2011-04-14 UTC", "2011-04-14 UTC", 
          "2011-04-18 UTC", "2011-04-15 UTC", "2011-04-15 UTC", "2011-04-13 UTC"))
rm(repdata)
repdata <- data.frame(MEMBER_ID, date)
repdata

(请注意,我意识到代码中存在i = 1的错误。我现在暂时忽略它,以免在for循环中添加另一个if语句)

杜夫59

您可以尝试使用ddply。

首先生成一个按日期排序的数据集,时间范围为52周。

#TEST SET GENERATION:
library(lubridate)
MEMBER_ID <- c(1,2,3,3,4,4,4,5,5,5,6,7,8,8,9,10,11,12,13,14)
date <- ymd(c("2011-04-13 UTC", "2011-04-22 UTC", "2011-04-17 UTC", "2011-04-26 UTC", 
          "2011-04-13 UTC", "2011-04-16 UTC", "2011-04-16 UTC", "2011-04-20 UTC", 
          "2011-04-13 UTC", "2011-04-18 UTC", "2011-04-13 UTC", "2011-04-13 UTC", 
          "2011-04-25 UTC", "2011-04-20 UTC", "2011-04-14 UTC", "2011-04-14 UTC", 
          "2011-04-18 UTC", "2011-04-15 UTC", "2011-04-15 UTC", "2011-04-13 UTC"))
rm(repdata)
repdata <- data.frame(MEMBER_ID, date)
repdata <- repdata[order(repdata$date),]
repdata

# define a timeframe of 4 weeks
timeframe <- as.difftime(52, units = "weeks")

然后调整以下代码:

library(plyr)

first.buyers <- ddply(repdata, .(MEMBER_ID),
                  function(x) x[c(TRUE, diff(x$date) > timeframe),])
first.buyers <- mutate(first.buyers, rpt52wk = "FIRST TIME BUYER")

final <- merge(repdata,first.buyers, all = TRUE)
final[is.na(final$rpt52wk),"rpt52wk"] <- "REPEAT BUYER"

我们得到以下结果:

   MEMBER_ID       date          rpt52wk
1          1 2011-04-13 FIRST TIME BUYER
2          2 2011-04-22 FIRST TIME BUYER
3          3 2011-04-17 FIRST TIME BUYER
4          3 2011-04-26     REPEAT BUYER
5          4 2011-04-13 FIRST TIME BUYER
6          4 2011-04-16     REPEAT BUYER
7          4 2011-04-16     REPEAT BUYER
8          5 2011-04-13 FIRST TIME BUYER
9          5 2011-04-18     REPEAT BUYER
10         5 2011-04-20     REPEAT BUYER
11         6 2011-04-13 FIRST TIME BUYER
12         7 2011-04-13 FIRST TIME BUYER
13         8 2011-04-20 FIRST TIME BUYER
14         8 2011-04-25     REPEAT BUYER
15         9 2011-04-14 FIRST TIME BUYER
16        10 2011-04-14 FIRST TIME BUYER
17        11 2011-04-18 FIRST TIME BUYER
18        12 2011-04-15 FIRST TIME BUYER
19        13 2011-04-15 FIRST TIME BUYER
20        14 2011-04-13 FIRST TIME BUYER

ddply按MEMBER_ID拆分数据帧,并将函数应用于每个子集。每个子集是一个具有固定MEMBER_ID和有序日期的数据帧。第一个元素将始终对应于第一个购买者,对于下一个元素,您必须确定自上次交易以来经过的时间是否大于您的阈值(如果是,则该成员可以再次考虑为第一个购买者)。

在上面的代码中,进行比较diff(x $ date)>时间范围时,您应检查时间单位是否一致(取决于日期格式)

一旦您找到了第一次购买者,我认为下一步是相当明确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过awk更改一行并在一行中添加其他列

来自分类Dev

基于行中的列值以及df中其他行中的列值创建新列?

来自分类Dev

我想在另一列下面附加一个 df 列并根据其他列分配行值

来自分类Dev

如何根据某个字符串组合是否在同一行的其他列中更改列中的值?(熊猫)

来自分类Dev

根据优先级将值保留在特定列中,并删除每一行的其他值

来自分类Dev

如何根据其他行中的列值进行过滤?

来自分类Dev

根据R中的其他列值复制行

来自分类Dev

如何创建一个函数,根据df中其他列的值返回某个列的值?

来自分类Dev

根据df中其他两个列的比较设置列值

来自分类Dev

根据其他列中的值将新列添加到df

来自分类Dev

如何根据其他三列中的特定值将值从df1中的一列复制到df2?

来自分类Dev

尝试将df1中的每一行与df1中的其他多行匹配

来自分类Dev

为每个主题ID添加额外的一行,并保留其他列中的值

来自分类Dev

如何通过其他列的值在一行中绘制两种颜色?

来自分类Dev

熊猫:将某行中某列的值设置为存储在其他df中其其他行的索引处的值

来自分类Dev

根据数据框中某列的条件,删除同一行其他列中的数据

来自分类Dev

从df2中的df1中找到一个值,并替换匹配行的其他值

来自分类Dev

从df2中的df1中找到一个值,并替换匹配行的其他值

来自分类Dev

根据其他列中的条件对一列中的值求和,并更改值

来自分类Dev

匹配任何列中的数据,并更改同一行中所有其他列中的数据

来自分类Dev

Excel(GoogleSpreadsheet):我想匹配一列中的文本并更改同一行的其他列

来自分类Dev

数据框获取同一df中其他列的值

来自分类Dev

根据R中其他列中的值对对行中的值求和

来自分类Dev

根据其他列行中的过滤值,在pandas数据框中创建一个新列

来自分类Dev

Python DataFrame:在其他列中具有相同值的特定值之前找到上一行的值

来自分类Dev

搜索必须在一行中存在的2个值,然后从其他列返回一个值

来自分类Dev

熊猫根据其他列的值从另一个更新一个df

来自分类Dev

熊猫根据其他列的值从另一个更新一个df

来自分类Dev

根据Pandas数据框中的其他三列更改一列的值

Related 相关文章

  1. 1

    如何通过awk更改一行并在一行中添加其他列

  2. 2

    基于行中的列值以及df中其他行中的列值创建新列?

  3. 3

    我想在另一列下面附加一个 df 列并根据其他列分配行值

  4. 4

    如何根据某个字符串组合是否在同一行的其他列中更改列中的值?(熊猫)

  5. 5

    根据优先级将值保留在特定列中,并删除每一行的其他值

  6. 6

    如何根据其他行中的列值进行过滤?

  7. 7

    根据R中的其他列值复制行

  8. 8

    如何创建一个函数,根据df中其他列的值返回某个列的值?

  9. 9

    根据df中其他两个列的比较设置列值

  10. 10

    根据其他列中的值将新列添加到df

  11. 11

    如何根据其他三列中的特定值将值从df1中的一列复制到df2?

  12. 12

    尝试将df1中的每一行与df1中的其他多行匹配

  13. 13

    为每个主题ID添加额外的一行,并保留其他列中的值

  14. 14

    如何通过其他列的值在一行中绘制两种颜色?

  15. 15

    熊猫:将某行中某列的值设置为存储在其他df中其其他行的索引处的值

  16. 16

    根据数据框中某列的条件,删除同一行其他列中的数据

  17. 17

    从df2中的df1中找到一个值,并替换匹配行的其他值

  18. 18

    从df2中的df1中找到一个值,并替换匹配行的其他值

  19. 19

    根据其他列中的条件对一列中的值求和,并更改值

  20. 20

    匹配任何列中的数据,并更改同一行中所有其他列中的数据

  21. 21

    Excel(GoogleSpreadsheet):我想匹配一列中的文本并更改同一行的其他列

  22. 22

    数据框获取同一df中其他列的值

  23. 23

    根据R中其他列中的值对对行中的值求和

  24. 24

    根据其他列行中的过滤值,在pandas数据框中创建一个新列

  25. 25

    Python DataFrame:在其他列中具有相同值的特定值之前找到上一行的值

  26. 26

    搜索必须在一行中存在的2个值,然后从其他列返回一个值

  27. 27

    熊猫根据其他列的值从另一个更新一个df

  28. 28

    熊猫根据其他列的值从另一个更新一个df

  29. 29

    根据Pandas数据框中的其他三列更改一列的值

热门标签

归档