Как использовать dplyr для условного изменения значений в столбце по группе? - PullRequest
3 голосов
/ 22 апреля 2019

У меня есть такие данные:

g1 g2 var 
 1  a Yes 
 1  a No 
 1  a No 
 1  b Yes 
 1  b Yes 
 1  b Yes 
 2  a No 
 2  a No 
 2  a No

Я хотел бы изменить все значения в var на Да, если в каждой группе g1 и g2 есть хотя бы одно Да в var.Я пытался использовать комбинации group_by и mutate, replace, ifelse, но безуспешно.Любая помощь приветствуется.

Ответы [ 4 ]

3 голосов
/ 22 апреля 2019

Мы можем использовать if/else вместо ifelse.Сгруппированы по «g1», «g2», if «Да» равно %in% «var», затем возвращает «Да» или возвращает «var»

library(dplyr)
df1 %>% 
   group_by(g1, g2) %>% 
   mutate(var = if("Yes" %in% var) "Yes" else var)
# A tibble: 9 x 3
# Groups:   g1, g2 [3]
#     g1 g2    var  
#  <int> <chr> <chr>
#1     1 a     Yes  
#2     1 a     Yes  
#3     1 a     Yes  
#4     1 b     Yes  
#5     1 b     Yes  
#6     1 b     Yes  
#7     2 a     No   
#8     2 a     No   
#9     2 a     No   

Или с помощью case_when

df1 %>% 
   group_by(g1, g2) %>% 
   mutate(var = case_when("Yes" %in% var ~ "Yes", TRUE ~ var))

data

df1 <- structure(list(g1 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), g2 = c("a", 
 "a", "a", "b", "b", "b", "a", "a", "a"), var = c("Yes", "No", 
 "No", "Yes", "Yes", "Yes", "No", "No", "No")), class = "data.frame", 
  row.names = c(NA, -9L))
2 голосов
/ 22 апреля 2019

Вы также можете сделать:

df %>%
 group_by(g1, g2) %>%
 mutate(var = ifelse(any(var == "Yes"), "Yes", "No"))

     g1 g2    var  
  <int> <chr> <chr>
1     1 a     Yes  
2     1 a     Yes  
3     1 a     Yes  
4     1 b     Yes  
5     1 b     Yes  
6     1 b     Yes  
7     2 a     No   
8     2 a     No   
9     2 a     No   

Здесь, если любое значение (для "g1" и "g2") в "var" равно Yes, возвращается Yes, в противном случаеNo.

1 голос
/ 22 апреля 2019

Дополнительная строка кода из двух вышеупомянутых решений, но с использованием ifelse или if_else путем создания нового столбца с последующим удалением и переименованием:

library(tidyverse)
df %>% 
  group_by(g1, g2) %>% 
  mutate(var2 = if_else("Yes" %in% var, "Yes", "No")) %>% 
  select(-var, var = var2)

результат:

     g1 g2    var  
  <dbl> <chr> <chr>
1     1 a     Yes  
2     1 a     Yes  
3     1 a     Yes  
4     1 b     Yes  
5     1 b     Yes  
6     1 b     Yes  
7     2 a     No   
8     2 a     No   
9     2 a     No   `
0 голосов
/ 23 апреля 2019

не в случае, если в порядке, веселее

df1 %>% 
group_by(g1,g2) %>% 
arrange (g1,g2,var) %>% 
mutate(var=last(var)) 

 # arranged alphabetically, var values may be changed to the last value by groups -- Yes in this case


         g1 g2    var  
      <int> <chr> <chr>
    1     1 a     Yes  
    2     1 a     Yes  
    3     1 a     Yes  
    4     1 b     Yes  
    5     1 b     Yes  
    6     1 b     Yes  
    7     2 a     No   
    8     2 a     No   
    9     2 a     No   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...