R (dplyr / tidyverse) |Использование mutate_at для создания ряда новых переменных с использованием операторов if_else - PullRequest
0 голосов
/ 12 декабря 2018

Я относительно новичок в этом сайте и в мире программирования, поэтому я прошу прощения, если об этом уже спрашивали.

Вот модифицированная версия фрейма данных, с которым я сейчас работаю (усечено)чтобы упростить диагностику):

  COUNTRY          b_2010 c_2010 b_2011  c_2011   
1 Australia          50     62     67     56     
2 Austria            50     48     48     95      
3 Belgium            50     26     67     25      
4 Bulgaria           50     54     42     64      

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

Я могу сделать это, выполнив что-то вроде этого:

dataframe %>% mutate(d_2010 = if_else(b_2010 & c_2010 >= 50, "A", "B"),
                     d_2011 = if_else(b_2011 & c_2011 >= 50, "A", "B"))

Это должно привести к появлению переменных индикатора, которые я собираюсь построить, но процесс будет ужасно обременительным, если у меня будет много времениВременные ряды.Я уверен, что есть способ сделать это более эффективно (используя mutate_at или какую-то другую функцию), но я не смог понять это.

Может ли кто-нибудь помочь мне?1015 *

Спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

На мой взгляд, " каждая существующая переменная в данном году " будет выглядеть примерно так:

dataframe %>% mutate(d_2010 = if_else(b_2010 >= 50 & c_2010 >= 50, "A", "B"),
                     d_2011 = if_else(b_2011 >= 50 & c_2011 >= 50, "A", "B"))

Если это цель, то я вычислю новые переменные впервый шаг и присоедините их позже к исходному фрейму данных.Как то так:

df <- dataframe %>% 
  gather(starts_with("b_"), starts_with("c_"), key = Key , value = Value) %>% 
  mutate(Year = paste0("d_"str_sub(Key, 3, 6))) %>% # creat your new variable 
  group_by(COUNTRY, Year) %>% 
  summarise(d =  ifelse(prod(Value >=50), "A", "B")) %>% # calculate the value
  spread(Year, d)

# join both
dataframe <- dataframe %>% 
  left_join(df)
...