如果列y = R中的值,则基于列x的min返回新列z

时间:2015-08-10 21:56:51

标签: r dplyr

我发现了类似的问题,专注于根据Y列的最小值返回X,但是我遇到了这个功能的问题。如果Y列等于特定值,我试图返回X列的最小值。

以下是样本数据框(df):

event.id    event.date.timestamp    touchpoint.date.timestamp   touchpoint.type
1   7/16/2015 11:08 11/27/2014 10:34    impression
1   7/16/2015 13:00 6/10/2015 13:19 visit
1   7/16/2015 11:08 12/15/2014 13:24    impression
2   7/16/2015 0:00  4/27/2015 23:04 impression
2   7/16/2015 11:08 11/11/2014 8:01 impression
2   7/16/2015 11:08 11/27/2014 11:50    visit
3   7/16/2015 11:08 12/4/2014 14:36 impression
3   7/16/2015 11:08 11/11/2014 8:01 impression
3   7/16/2015 11:08 12/15/2014 13:21    visit
4   7/16/2015 11:08 11/27/2014 10:01    impression
4   7/16/2015 11:08 11/27/2014 10:22    impression

我正在使用dplyr通过event.id对上表进行分组。然后我试图总结一下,但是想要一个新的列(first_impression),它只报告touchpoint.atestamp列的min,如果touchpoint.type列是=" impression"。

到目前为止我已经

> df.new.grouped <- group.by(df, event.id)
> df.new.summarised <- summarise(df.new.grouped
  ,first_imp = min(filter(by.imp_to_click, touchpoint.type == "impression"),touchpoint.date.timestamp))

但这并不是肯定的。我知道你无法过滤,这只是我最近的尝试。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为这会奏效:

df.summarized <- df %>%
    group_by(event.id) %>%
    filter(touchpoint.type=="impression") %>%
    mutate(touchpoint.date.timestamp = as.POSIXct(touchpoint.date.timestamp, format="%m/%d/%Y %H:%M")) %>%
    summarise(first_imp = min(touchpoint.date.timestamp))

根据理查德的评论,我的假设是您的日期列格式化为字符串,而不是日期,因此min()不会对它们起作用。您的问题也是一个很好的例子,说明使用%>%进行管道处理可以更轻松地拼出并遵循您的操作而不会创建大量新对象。

答案 1 :(得分:0)

我认为,如果您的最短约会对应于&#34;访问&#34;你不想为那个id返回任何东西,对吗?

如果这是正确检查我的例子(3种不同的选择方式),如果这不正确你可以稍微修改一下,或者使用@ulfelder提供的答案,这看起来很完美。

library(lubridate)
library(dplyr)

# example dataset
dt = data.frame(id = c(1,1,1,2,2,2),
                date = c("2015-01-02","2015-01-04","2015-01-03",
                         "2015-01-11","2015-01-08","2015-01-06"),
                type = c("impression","visit","visit","impression","visit","visit"))

# save as datetime
dt$date = ymd(dt$date) # you'll probably need the ymd_hms function if you have time as well

dt %>% 
  group_by(id) %>%
  arrange(date) %>% 
  slice(1) %>% 
  filter(type=="impression")

dt %>% 
  group_by(id) %>%
 filter(min_rank(date)==1 & type=="impression")

dt %>% 
  group_by(id) %>% 
  top_n(1,desc(date)) %>%
  filter(type=="impression")