Вложенный, если еще; переполнение стека?

#r #dplyr

Вопрос:

Я пытаюсь добавить новую переменную в tibble, которая представляет собой население каждой из областей, которые я изучаю, используя функцию mutate. Для этого, я думаю, мне нужно использовать функцию ifelse (я попробовал функцию case_when), поскольку зоны идентифицируются по их аббревиатурам; и я пытаюсь присвоить каждой из их аббревиатур население.

Так вот чем я занимался:

 hosp%>% mutate(poblacion =ifelse(hosp$provincia_iso=="A", 1879888,  ifelse(hosp$provincia_iso=="VI", 333940, 
        ifelse(hosp$provincia_iso=="AB", 388270, ifelse(hosp$provincia_iso=="AL", 727945, ifelse(hosp$provincia_iso=="O", 1018784, 
        ifelse(hosp$provincia_iso=="AV", 157664, ifelse((hosp$provincia_iso=="BA"), 672137, ifelse((hosp$provincia_iso=="PM"), 672137,
                 ifelse((hosp$provincia_iso=="B"), 5743402, ifelse((hosp$provincia_iso=="BU"), 357650,
                 ifelse((hosp$provincia_iso=="CC"), 391850,ifelse((hosp$provincia_iso=="CA"), 1244049,
                 ifelse((hosp$provincia_iso=="S"), 582905,ifelse((hosp$provincia_iso=="CS"), 585590,
                 ifelse((hosp$provincia_iso=="CR"), 495045,ifelse((hosp$provincia_iso=="CO"), 781451, 
                 ifelse((hosp$provincia_iso=="CU"), 196139, ifelse((hosp$provincia_iso=="GI"), 781788,
                 ifelse((hosp$provincia_iso=="GR"), 919168, ifelse((hosp$provincia_iso=="GU"), 261995,
                 ifelse((hosp$provincia_iso=="SS"), 727121,  ifelse((hosp$provincia_iso=="H"), 524278,
                 ifelse((hosp$provincia_iso=="HU"), 222687,  ifelse((hosp$provincia_iso=="J"), 631381,
                 ifelse((hosp$provincia_iso=="C"), 1121815,  ifelse((hosp$provincia_iso=="LO"), 319914, 
                 ifelse((hosp$provincia_iso=="GC"), 131065, ifelse((hosp$provincia_iso=="LE"), 456439,
                 ifelse((hosp$provincia_iso=="L"), 438517, ifelse((hosp$provincia_iso=="LU"), 327946,
                 ifelse((hosp$provincia_iso=="M"), 6779888,  ifelse((hosp$provincia_iso=="MA"), 1685920,
                 ifelse((hosp$provincia_iso=="MU"), 1511251, ifelse((hosp$provincia_iso=="NA"), 661197,
                 ifelse((hosp$provincia_iso=="OR"), 306650, ifelse((hosp$provincia_iso=="P"), 160321,
                 ifelse((hosp$provincia_iso=="PO"), 945408,  ifelse((hosp$provincia_iso=="SA"), 329245,
                 ifelse((hosp$provincia_iso=="TF"), 1044887,  ifelse((hosp$provincia_iso=="SG"), 153478,
                 ifelse((hosp$provincia_iso=="SE"), 1950219, ifelse((hosp$provincia_iso=="SO"), 88894,
                 ifelse((hosp$provincia_iso=="T"), 816772, ifelse((hosp$provincia_iso=="TE"), 134176, 
                 ifelse((hosp$provincia_iso=="TO"), 703772, ifelse((hosp$provincia_iso=="V"), 2591875,
                 ifelse((hosp$provincia_iso=="VA"), 520649, ifelse((hosp$provincia_iso=="BI"), 1159443, 
                 ifelse((hosp$provincia_iso=="ZA"), 170588, ifelse((hosp$provincia_iso=="Z"), 972528, 
                 ifelse((hosp$provincia_iso=="CE"), 84202,  ifelse((hosp$provincia_iso=="ML"), 87076, NA)))))))))))))

 

Но, может быть, вам будет проще помочь мне с более простым примером:

 province <- c("A", "B", "C", "D")
cases<-c(135,120,160, 100)
df <- data.frame(province, cases)

df%>% mutate(poblacion =ifelse(df$ province=="A", 1879888,  ifelse( df$ province=="C", 333940,
ifelse( df$ province=="B", 388270, ifelse(df$ province=="D", 727945, NA))))))))))))))))))))))

 

Проблема в том, что, хотя это работает, когда я запускаю верхнюю часть сценария вопроса, я получаю некоторую «ошибку стекового потока» для строки 24, и я получаю значения только для последних 2 областей сценария.

Также я хотел бы спросить, есть ли более простой способ сделать это.

Ответ №1:

Вот как вы могли бы это сделать с помощью case_when :

 province <- c("A", "B", "C", "D")
cases<-c(135,120,160, 100)
df <- data.frame(province, cases)

df%>% 
  mutate(poblacion =case_when(
    province=="A" ~ 1879888,
    province=="C" ~ 333940,
    province=="B" ~ 388270, 
    province=="D" ~ 727945, 
    TRUE ~ NA_real_))

#   province cases poblacion
# 1        A   135   1879888
# 2        B   120    388270
# 3        C   160    333940
# 4        D   100    727945
 

Я думаю, что если бы вы использовали этот подход, это решило бы проблему, например:

 hosp%>% 
  mutate(poblacion =
    cae_when(
      hosp$provincia_iso=="A" ~ 1879888,  
      hosp$provincia_iso=="VI" ~ 333940, 
      hosp$provincia_iso=="AB" ~ 388270, 
      hosp$provincia_iso=="AL" ~ 727945, 
      hosp$provincia_iso=="O" ~ 1018784, 
      hosp$provincia_iso=="AV" ~ 157664, 
      hosp$provincia_iso=="BA" ~ 672137, 
      hosp$provincia_iso=="PM" ~ 672137,
      hosp$provincia_iso=="B" ~ 5743402, 
      hosp$provincia_iso=="BU" ~ 357650,
      hosp$provincia_iso=="CC" ~ 391850,
      hosp$provincia_iso=="CA" ~ 1244049,
      hosp$provincia_iso=="S" ~ 582905,
      hosp$provincia_iso=="CS" ~ 585590,
      hosp$provincia_iso=="CR" ~ 495045,
      hosp$provincia_iso=="CO" ~ 781451, 
      hosp$provincia_iso=="CU" ~ 196139, 
      hosp$provincia_iso=="GI" ~ 781788,
      hosp$provincia_iso=="GR" ~ 919168, 
      hosp$provincia_iso=="GU" ~ 261995,
      hosp$provincia_iso=="SS" ~ 727121,  
      hosp$provincia_iso=="H" ~ 524278,
      hosp$provincia_iso=="HU" ~ 222687,  
      hosp$provincia_iso=="J" ~ 631381,
      hosp$provincia_iso=="C" ~ 1121815,  
      hosp$provincia_iso=="LO" ~ 319914, 
      hosp$provincia_iso=="GC" ~ 131065, 
      hosp$provincia_iso=="LE" ~ 456439,
      hosp$provincia_iso=="L" ~ 438517, 
      hosp$provincia_iso=="LU" ~ 327946,
      hosp$provincia_iso=="M" ~ 6779888,  
      hosp$provincia_iso=="MA" ~ 1685920,
      hosp$provincia_iso=="MU" ~ 1511251, 
      hosp$provincia_iso=="NA" ~ 661197,
      hosp$provincia_iso=="OR" ~ 306650, 
      hosp$provincia_iso=="P" ~ 160321,
      hosp$provincia_iso=="PO" ~ 945408,  
      hosp$provincia_iso=="SA" ~ 329245,
      hosp$provincia_iso=="TF" ~ 1044887,  
      hosp$provincia_iso=="SG" ~ 153478,
      hosp$provincia_iso=="SE" ~ 1950219, 
      hosp$provincia_iso=="SO" ~ 88894,
      hosp$provincia_iso=="T" ~ 816772, 
      hosp$provincia_iso=="TE" ~ 134176, 
      hosp$provincia_iso=="TO" ~ 703772, 
      hosp$provincia_iso=="V" ~ 2591875,
      hosp$provincia_iso=="VA" ~ 520649, 
      hosp$provincia_iso=="BI" ~ 1159443, 
      hosp$provincia_iso=="ZA" ~ 170588, 
      hosp$provincia_iso=="Z" ~ 972528, 
      hosp$provincia_iso=="CE" ~ 84202,  
      hosp$provincia_iso=="ML" ~ 87076,
      TRUE ~ NA_real_))

 

Ответ №2:

Попробуй match

 > df %>% 
    mutate(poblacion = c(1879888,388270,333940,727945)[match(province,c("A","B","C","D"))])
  province cases poblacion
1        A   135   1879888
2        B   120    388270
3        C   160    333940
4        D   100    727945