如何计算因子频率并组织R中的新数据帧

问题描述 投票:0回答:1

我有这样的数据帧:

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,并知道他们购买了哪些产品以及哪一年。是否有可能创建一个新的数据框来显示ID以及它们出现的次数以及何时发生?像这样的东西:

test2 = data.frame("times" = c(3, 1), "id" = c("FC01", "FC03"),
                   "year" = c("2018, 2017, 2016", "2018"))

我使用dplyr并尝试按ID分组并过滤掉每次出现不止一次的ID,但我不知道如何继续获得类似test2的内容。我很欣赏这方面的任何提示。

r dataframe dplyr r-factor summarize
1个回答
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()
  • 对于(唯一的)年份字符串名称的粘贴列表,与this answer相同的方法。 toString(...)paste0(as.character(...), collapse=' ')更干净
  • 请注意,我们必须使用unique(year),因为您可能在同一年有多个条目。
  • 为了能够filter(between(year, 2016, 2018)),我们必须首先确定year是数字,而不是一个因素(或至少,确保因子水平也是2015..2018,以便直接做as.numeric()按预期工作,而不是给予1 ..4
© www.soinside.com 2019 - 2024. All rights reserved.