Данные группы в R - PullRequest
       7

Данные группы в R

0 голосов
/ 29 ноября 2018

У меня есть такой фрейм данных:

   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?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Учитывая, что ваш начальный фрейм данных называется df:

library(dplyr)

df %>%
  arrange(Tag) %>% 
  group_by(User) %>%
  summarise(Tag = paste(unique(Tag), collapse = ", ")) %>%      
  mutate(TagSum = case_when(
    Tag == "TagA, TagB, TagC" ~ "All",
    Tag == "TagA, TagB" ~ "A_B",
    Tag == "TagA, TagC" ~ "A_C",
    Tag == "TagB, TagC" ~ "B_C",
    Tag == "TagA" ~ "OnlyA",
    Tag == "TagB" ~ "OnlyB",
    Tag == "TagC" ~ "OnlyC"
  )) %>%
  select(- Tag)

Результат:

# A tibble: 3 x 2
  User  TagSum
  <chr> <chr> 
1 A     All   
2 B     OnlyC 
3 C     A_C   
0 голосов
/ 29 ноября 2018

Ваши данные:

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(), чтобы создать столбик индикатора, выберите только столбцы индикатора, создайте длинный столбец с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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...