首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Which.max不工作,但which.min (在R中)

Which.max不工作,但which.min (在R中)
EN

Stack Overflow用户
提问于 2018-07-04 10:49:37
回答 1查看 2.2K关注 0票数 1

我有一个表,列出了一系列不同的活动(或项目)的事务列表。我想要做的是从每个活动开始时根据每个活动的第一个交易日来推导。数据涵盖了所有活动的所有事务,只有以下两列是相关的: Campaign.ID (数值),Created.At (Yyyy)。这是我目前拥有的:

代码语言:javascript
复制
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也应该这样做。我试过寻找答案,但没有遇到任何有同样问题的人。

数据如下所示:

代码语言:javascript
复制
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返回如下内容:

代码语言:javascript
复制
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,我也需要同样的东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 11:16:21

您应该将temp$slice()调用中删除。

实际上,which.max(temp$Recency)将返回整个数据中最大值的索引(而不是每个Campaign.ID中的一个),这对于Campaign.ID定义的任何单独组都是越界的(我很惊讶这不会引发错误)。

slice()中的表达式是在数据的上下文中计算的。但是,由于您的数据不包含名为temp的列,因此在计算调用时,将在全局环境中找到temp$Recency。因此,您拥有的代码等效于:

代码语言:javascript
复制
max_row <- which.max(temp$Recency)
temp %>% 
  group_by(Campaign.ID) %>% 
  slice(max_row)

然后,任何小于max_row观测值的组都会被排除在外。

但是,如果您编写了slice(which.max(Recency)),那么在现在分组的数据中,Recency会作为一列被找到,并在每个组中得到正确的评估。

因此,要想得到你想要的结果,只需写:

代码语言:javascript
复制
df %>%
  group_by(Campaign.ID) %>%
  slice(which.max(Recency))

正如@LAP评论的那样。

至于为什么which.min看起来起作用,这可能是因为带全局最小值的行可能是第一行(甚至是第一行?),所以大多数组(如果不是全部)至少有那么多行。也就是说,如果which.min(temp$Recency) == 1,您总是只得到每个子组中的第一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51171873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档