如何计算因子频率并在 R 中的新数据框中进行组织
How to count factors frequency and organize in a new dataframe in R
我有这样一个数据框:
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,并知道他们购买了哪些产品以及哪一年。
是否可以创建一个新的数据框来显示 id 以及它们出现的次数以及发生的时间?像这样:
test2 = data.frame("times" = c(3, 1), "id" = c("FC01", "FC03"),
"year" = c("2018, 2017, 2016", "2018"))
我用了dplyr
,尝试按id分组,过滤每一个出现不止一次的id,但不知道如何继续得到类似这样的test2。我很欣赏这方面的任何提示。
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()
。
- 对于年份的(唯一)字符串名称的粘贴列表,方法与 this answer 相同。
toString(...)
比 paste0(as.character(...), collapse=' ')
更简洁
- 请注意,我们必须使用
unique(year)
,因为同一年您可能有多个条目。
- 为了能够
filter(between(year, 2016, 2018))
,我们必须首先将 year
修正为数字,而不是因子(或者至少,确保因子水平也是 2015..2018这样直接做 as.numeric()
就可以按预期工作,而不是给出 1..4
我有这样一个数据框:
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,并知道他们购买了哪些产品以及哪一年。 是否可以创建一个新的数据框来显示 id 以及它们出现的次数以及发生的时间?像这样:
test2 = data.frame("times" = c(3, 1), "id" = c("FC01", "FC03"),
"year" = c("2018, 2017, 2016", "2018"))
我用了dplyr
,尝试按id分组,过滤每一个出现不止一次的id,但不知道如何继续得到类似这样的test2。我很欣赏这方面的任何提示。
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()
。 - 对于年份的(唯一)字符串名称的粘贴列表,方法与 this answer 相同。
toString(...)
比paste0(as.character(...), collapse=' ')
更简洁
- 请注意,我们必须使用
unique(year)
,因为同一年您可能有多个条目。 - 为了能够
filter(between(year, 2016, 2018))
,我们必须首先将year
修正为数字,而不是因子(或者至少,确保因子水平也是 2015..2018这样直接做as.numeric()
就可以按预期工作,而不是给出 1..4