我有一个表,列出了一系列不同的活动(或项目)的事务列表。我想要做的是从每个活动开始时根据每个活动的第一个交易日来推导。数据涵盖了所有活动的所有事务,只有以下两列是相关的: Campaign.ID (数值),Created.At (Yyyy)。这是我目前拥有的:
temp$Recency = as.integer(today() - temp$Created.At) # Get number of days ago
df = temp %>% # Multiple transactions per user - we only need the most recent
group_by(Campaign.ID) %>% # Group transactions together by campaign
slice(which.max(temp$Recency)) # Find first transaction - ie biggest Recency value
df = as.data.frame(df)因此,我创建了temp$Recency列,以便将date列从今天起更改为天的整数。然后,我根据他们的活动ID对数据进行分组,并尝试只为每个活动选择第一个事务。在temp$Recency中值最大的
令我费解的是,如果我使用which.min查找每个活动的最后一个事务,并为每个活动返回一个带有单个(最近的)实例的数据框架,那么这段代码工作得很好。然而,当我尝试使用which.max时,它会返回一个空的数据帧。
我不明白为什么会这样,如果which.min按预期工作,那么which.max也应该这样做。我试过寻找答案,但没有遇到任何有同样问题的人。
数据如下所示:
Created.At Campaign.ID Recency
2018-06-21 1883 13
2018-06-21 1890 13
2018-06-20 1883 14在50到60次不同的战役中,大约有3000项记录。
which.min返回如下内容:
Created.At Campaign.ID Recency
2017-07-02 19 367
2017-05-25 91 405
2017-06-06 344 393
2017-06-30 451 369
2017-06-30 509 369
2017-08-16 551 322除了which.max,我也需要同样的东西
发布于 2018-07-04 11:16:21
您应该将temp$从slice()调用中删除。
实际上,which.max(temp$Recency)将返回整个数据中最大值的索引(而不是每个Campaign.ID中的一个),这对于Campaign.ID定义的任何单独组都是越界的(我很惊讶这不会引发错误)。
slice()中的表达式是在数据的上下文中计算的。但是,由于您的数据不包含名为temp的列,因此在计算调用时,将在全局环境中找到temp$Recency。因此,您拥有的代码等效于:
max_row <- which.max(temp$Recency)
temp %>%
group_by(Campaign.ID) %>%
slice(max_row)然后,任何小于max_row观测值的组都会被排除在外。
但是,如果您编写了slice(which.max(Recency)),那么在现在分组的数据中,Recency会作为一列被找到,并在每个组中得到正确的评估。
因此,要想得到你想要的结果,只需写:
df %>%
group_by(Campaign.ID) %>%
slice(which.max(Recency))正如@LAP评论的那样。
至于为什么which.min看起来起作用,这可能是因为带全局最小值的行可能是第一行(甚至是第一行?),所以大多数组(如果不是全部)至少有那么多行。也就是说,如果which.min(temp$Recency) == 1,您总是只得到每个子组中的第一行。
https://stackoverflow.com/questions/51171873
复制相似问题