Заполнить столбец условно, если предыдущий столбец содержал значение? - PullRequest
3 голосов
/ 25 апреля 2019

Я бы хотел заполнить столбец условно, используя dplyr :: mutate.Один уровень новой переменной должен соответствовать, если значение вообще присутствовало в предыдущем столбце, а другой уровень является условием 'else'.

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

         group     piece      answer         agreement
        group1     A          noise       good 
        group1     A          silence     good
        group1     A          silence     good
        group1     B          silence     bad
        group1     B          loud_noise  bad
        group1     B          noise       bad
        group1     B          loud_noise  bad
        group1     B          noise       bad
        group2     C          silence     good
        group2     C          silence     good

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

        group     piece      answer     agreement   new_agreement
        group1     A          noise       good       bad
        group1     A          silence     good       bad
        group1     A          silence     good       bad
        group1     B          silence     bad        bad
        group1     B          loud_noise  bad        bad
        group1     B          noise       bad        bad
        group1     B          loud_noise  bad        bad
        group1     B          noise       bad        bad
        group2     C          silence     good       good
        group2     C          silence     good       good

Но case_when не совсем это делает - это просто копирует одну и ту же переменную снова:

   newdf <- df %>%
    group_by(group) %>%
    mutate(new_agreement = case_when(agreement == 'bad' ~
    "inconsistent", agreement =='good' ~ "consistent")) %>%
    as.data.frame()

Ответы [ 2 ]

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

Просто добавьте any(agreement == 'bad')

df %>%
  group_by(group) %>%
  mutate(new_agreement = case_when(any(agreement == 'bad') ~"inconsistent",
                                   agreement =='good' ~ "consistent"))
    # A tibble: 10 x 5
    # Groups:   group [2]
       group  piece answer     agreement new_agreement
       <fct>  <fct> <fct>      <fct>     <chr>        
     1 group1 A     noise      good      inconsistent 
     2 group1 A     silence    good      inconsistent 
     3 group1 A     silence    good      inconsistent 
     4 group1 B     silence    bad       inconsistent 
     5 group1 B     loud_noise bad       inconsistent 
     6 group1 B     noise      bad       inconsistent 
     7 group1 B     loud_noise bad       inconsistent 
     8 group1 B     noise      bad       inconsistent 
     9 group2 C     silence    good      consistent   
    10 group2 C     silence    good      consistent   

Вы даже можете использовать if_else с any:

df %>% 
  group_by(group) %>% 
  mutate(new_agreement= if_else(any(agreement=="bad"), "inconsistent", "consistent") )
0 голосов
/ 25 апреля 2019

С case_when, используйте any.

library(dplyr)

df %>%
  group_by(group) %>%
  mutate(new_agreement = case_when(
    any(agreement == 'bad') ~ 'inconsistent',
    TRUE ~ 'consistent'))
## A tibble: 10 x 5
## Groups:   group [2]
#   group  piece answer     agreement new_agreement
#   <fct>  <fct> <fct>      <fct>     <chr>        
# 1 group1 A     noise      good      inconsistent 
# 2 group1 A     silence    good      inconsistent 
# 3 group1 A     silence    good      inconsistent 
# 4 group1 B     silence    bad       inconsistent 
# 5 group1 B     loud_noise bad       inconsistent 
# 6 group1 B     noise      bad       inconsistent 
# 7 group1 B     loud_noise bad       inconsistent 
# 8 group1 B     noise      bad       inconsistent 
# 9 group2 C     silence    good      consistent   
#10 group2 C     silence    good      consistent   

Данные в формате dput.

df <-
structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L), .Label = c("group1", "group2"), 
class = "factor"), piece = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", "B", "C"), 
class = "factor"), answer = structure(c(2L, 3L, 3L, 
3L, 1L, 2L, 1L, 2L, 3L, 3L), .Label = c("loud_noise", 
"noise", "silence"), class = "factor"), agreement = 
structure(c(2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), 
.Label = c("bad", "good"), class = "factor")), 
class = "data.frame", row.names = c(NA, -10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...