R - Мутировать новую переменную со строковой информацией от других переменных - PullRequest
0 голосов
/ 27 сентября 2019

Для моей диссертации MSc я сортирую файл данных в R. В этом файле есть строковые значения, которые не находятся в правильных столбцах.Я пытаюсь упорядочить их или мутировать новые столбцы, где новый столбец принимает только строку, если она соответствует определенному регулярному выражению.Позвольте мне показать вам, что я имею в виду.Для наглядности я сделал следующий фрейм данных.Здесь 4 человека попросили дать свой первый и второй любимый цвет и еду, или только первый, если у них был только один любимый (NA также возможен).Однако из-за какой-то ошибки ответы смешиваются в 4 столбцах.

     df <- data.frame(person_ = c("Peter", "Lucas", "Jake", "Harry"), 
             note1 =c("1. Red", "2. Green", "1. Food: Hamburger", "1. Food: Pizza"), 
             note2 =c("1. Food: Pasta", "1. Blue", NA, "1. Yellow"),
             note3 =c("2. Food: Spaghetti", "2. Food: Chips", "1. Red", NA),
             note4 =c("2. Purple", "1. Food: Pancake", "2. White", NA))

Я хотел бы знать, как я могу заказать их.Вы можете распознать первого и второго фаворита по '1.'и' 2.».И вы можете узнать любимую еду по «Еда:».Этот факт сразу заставляет меня думать, что я должен работать с регулярными выражениями.Я подумал об этом и попытался изменить новые столбцы, чтобы значения выбирались из столбцов «note1», «note2», «note3» или «note4» и соответствовали регулярному выражению.Я не справился ....

Для полной ясности, это то, чего я в конечном итоге хочу.

    df_1 <- data.frame(person_ = c("Peter", "Lucas", "Jake", "Harry"), 
               note1 =c("1. Red", "2. Green", "1. Food: Hamburger", "1. Food: Pizza"), 
               note2 =c("1. Food: Pasta", "1. Blue", NA, "1. Yellow"),
               note3 =c("2. Food: Spaghetti", "2. Food: Chips", "1. Red", NA),
               note4 =c("2. Purple", "1. Food: Pancake", "2. White", NA),
               fav1_color =c("Red", "Blue", "Red", "Yellow"),
               fav2_color =c("Purple", "Green", "White", NA),
               fav1_food =c("Pasta", "Pancake", "Hamburger", "Pizza"),
               fav2_food =c("Spaghetti", "Chips", NA, NA))

У кого-нибудь из вас есть идеи, как решить эту проблему?Заранее спасибо.

1 Ответ

0 голосов
/ 27 сентября 2019

Вот решение, использующее pivot_longer и pivot_wider из нового tidyr:

dfnew<-df %>% pivot_longer(-person_, names_to="note",values_to="value") %>%
  mutate(note=gsub("(\\d)\\. (\\w*\\:)?.*","\\1 \\2",value), value=gsub("(\\d\\.) (\\w*\\:)? ?(.*)","\\3",value)) %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = note, values_from = value, names_prefix = "fav")

dfnew
# A tibble: 4 x 5
  person_ `fav1 ` `fav1 Food:` `fav2 Food:` `fav2 `
  <fct>   <chr>   <chr>        <chr>        <chr>  
1 Peter   Red     Pasta        Spaghetti    Purple 
2 Lucas   Blue    Pancake      Chips        Green  
3 Jake    Red     Hamburger    NA           White  
4 Harry   Yellow  Pizza        NA           NA     

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

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