首页 > 解决方案 > R中的分组数据

问题描述

我有一个数据框,例如:

   User Tag
1 A TagA
2 A TagB
3 A TagC
3 B TagC
4 C TagA
5 C TagC

我想将此数据与此新信息分组:

All = TagA & TagB & TagC
A_B= TagA & TagB
A_C = TagA & TagC
B_C = TagB & TagC
OnlyA = TagA
OnlyB = TagB
OnlyC = TagC

我的最终数据框应如下所示:

   User TagSum
1 A All
2 B OnlyC
3 C A_C

我怎样才能在 R 中做到这一点?

谢谢你的帮助。

标签: rdataframegroup-by

解决方案


您的数据:

df <- tribble(
  ~User, ~Tag,
  "A", "TagA",
  "A", "TagB",
  "A", "TagC",
  "B", "TagC",
  "C", "TagA",
  "C", "TagC"
) %>%
  as_tibble()

创建指标列:

df <- df %>% cbind(indicator = rep(TRUE, nrow(df))) %>% as_tibble()

用于tidyr::spread()创建指标 tibble,仅选择指标列,使用 创建长 tibble tidyr::gather,仅过滤 TRUE 值,选择 User 和 TagSum 值:

df <- df %>%
  spread(Tag, indicator, fill = FALSE) %>%
  mutate(All = TagA & TagB & TagC,
         A_B = TagA & TagB & !TagC,
         A_C = TagA & !TagB & TagC,
         B_C = !TagA & TagB & TagC,
         OnlyA = TagA & !TagB & !TagC,
         OnlyB = !TagA & TagB & !TagC,
         OnlyC = !TagA & !TagB & TagC,
  ) %>%
  select(-(TagA:TagC)) %>%
  gather(TagSum, Value, All:OnlyC) %>%
  filter(Value == TRUE) %>%
  arrange(User) %>%
  select(User, TagSum)

结果:

# A tibble: 3 x 2
  User  TagSum
  <chr> <chr> 
1 A     All   
2 B     OnlyC 
3 C     A_C 

推荐阅读