В группах dplyr, как я могу выбрать группу, которая имеет комбинацию определенного значения только с одним другим из нескольких значений - PullRequest
0 голосов
/ 30 мая 2019

У меня есть набор данных, который выглядит следующим образом

Group  Company
1      A
1      XX
1      A
1      XX
2      XX
2      A
2      XX
2      B
3      B
3      B
3      XX
3      A
4      C
4      C
4      XX
4      XX

Это на самом деле больше, с большим количеством столбцов, строк и значений, но проблема, которую я хочу решить, на данный момент касается этих двух столбцов.

Теперь я бы хотел, чтобы каждая группа заменила Company следующим образом:

Если XX существует в группе, вместе с любым другим уникальным значением компании, тогда компания должна быть заменена этим уникальным значением. Вот так:

Group  Company
1      A
1      XX
1      A
1      XX

Должен стать:

Group  Company
1      A
1      A
1      A
1      A

Если любая Группа содержит более 2 уникальных значений для Company , включая «XX», то значение Company этой группы должно остаться неизменным, например:

Group  Company
2      XX
2      A
2      XX
2      B

Я пытаюсь добиться этого с помощью dplyr, мне удалось сделать то, что я хотел, но только для одного значения Company , вот так:

result <- df%>%
group_by(Group) %>%
mutate(final = ifelse(Company %in% c("A", "XX"), 1,2)) %>% 
summarize(test = mean(final))

result$final <- ifelse(result$test== 1, "A", result$Company)

Возможно, я мог бы сделать это с помощью цикла, но я уверен, что это не лучший способ сделать это.

Есть ли чистый способ сделать это с помощью dplyr? (конечно, другие решения приветствуются)

Окончательный кадр данных будет выглядеть следующим образом:

Group  Company
1      A
1      A
1      A
1      A
2      XX
2      A
2      XX
2      B
3      B
3      B
3      XX
3      A
4      C
4      C
4      C
4      C

Спасибо всем за потраченное время.

1 Ответ

2 голосов
/ 30 мая 2019

Вот способ с dplyr -

df %>%
  group_by(Group) %>%
  mutate(
    Company = case_when(
                ("XX" %in% Company) && (n_distinct(Company) == 2) ~ Company[Company != "XX"][1], 
                TRUE ~ Company
              )
  ) %>% 
  ungroup()

# A tibble: 16 x 2
   Group Company
   <int> <chr>  
 1     1 A      
 2     1 A      
 3     1 A      
 4     1 A      
 5     2 XX     
 6     2 A      
 7     2 XX     
 8     2 B      
 9     3 B      
10     3 B      
11     3 XX     
12     3 A      
13     4 C      
14     4 C      
15     4 C      
16     4 C 
...