我有一个这样的数据框:
test1 = data.frame("id" = c("FC01", "FC01", "FC22", "FC03", "FC01"),
"product" = c("p01", "p02", "p03", "p01", "p03"),
"year" = c("2018", "2017", "2015", "2018", "2016"))
我需要找到在2016年至2018年之间购买的ID大于onc的ID,并知道他们购买了哪些产品以及哪一年。 是否可以创建一个新的数据框来显示ID,以及ID出现多少次以及何时发生?像这样:
test2 = data.frame("times" = c(3, 1), "id" = c("FC01", "FC03"),
"year" = c("2018, 2017, 2016", "2018"))
我使用dplyr
并尝试按ID分组并过滤出现的多个ID,但是我不知道如何继续获得类似test2的信息。我感谢这方面的任何提示。
答案 0 :(得分:1)
test1$year <- as.numeric(as.character(test1$year))
test1 %>% filter(between(year,2016,2018))
%>% group_by(id)
%>% summarize(times = n(),
year = toString(unique(year)))
id times year
<fct> <int> <chr>
1 FC01 3 2018 2017 2016
2 FC03 1 2018
注意:
times
列很容易,我们只使用实用程序功能dplyr::n()
。toString(...)
比paste0(as.character(...), collapse=' ')
更干净的代码unique(year)
,因为您可能在同一年有多个条目。filter(between(year, 2016, 2018))
,我们必须首先将year
固定为数字,而不是一个因数(或者至少要确保该因数水平也为2015..2018,以便直接执行as.numeric()
可以达到预期目的,而不是给出1..4