Откатить и объединить значения в r - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь раскрутить два столбца, которые не всегда имеют одинаковое количество значений в ячейке, а затем объединить значения, которые соответствуют между двумя столбцами.Например:

library('dplyr')
library('tidyr')

#Sample Data
df <- data.frame(id = c(1:4),
             first.names = c('Michael, Jim', 'Michael, Michael', 'Creed', 'Creed, Jim'),
             last.names = c('Scott, Halpert', 'Scott, Cera', '', 'Halpert'))

Не все значения в df $ first.names связаны со значением в df $ last.names.Я пытаюсь получить следующие результаты:

#Desired output
df.results <- data.frame(id = c(1,1,2,2,3,4,4),
                     first.names = c('Michael', 'Jim', 'Michael', 'Michael', 'Creed', 'Creed', 'Jim'),
                     last.names = c('Scott', 'Halpert', 'Scott', 'Cera', '', '', 'Halpert'),
                     full.names = c('Michael Scott', 'Jim Halpert', 'Michael Scott', 'Michael Cera', 'Creed', 'Creed', 'Jim Halpert'))

Я пытался использовать unnest, он работает для first.names, но не для last.names (он пропускает строку, где last.names пусто):

#convert to characters
df$first.names <- as.character(df$first.names)
df$last.names <- as.character(df$last.names)

#Unnest first names
df <- df %>% 
      transform(first.names = strsplit(first.names, ',')) %>%
      unnest(first.names)%>%
      transform(last.names = strsplit(last.names, ',')) %>%
      unnest(last.names)

Затем я собирался удалить повторяющиеся строки, но это по-прежнему не решает проблемы со значениями в df $ first.names, которые не имеют значения в df $ last.names

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 20 февраля 2019

Проверьте это решение:

library(tidyverse)

df %>%
  as_tibble() %>%
  mutate_at(2:3, ~ strsplit(as.character(.x), ',') %>% map(~ str_trim(.x))) %>%
  mutate(
    First = map2_chr(first.names, last.names, ~ paste(.x[1], .y[1])),
    Second = map2_chr(first.names, last.names, ~ paste(.x[2], .y[2]))
  ) %>%
  mutate_at(4:5, ~ str_remove_all(.x, 'NA') %>% str_trim()) %>%
  gather('x', 'full.names', First:Second) %>%
  filter(full.names != '') %>%
  mutate(
    first.names = map_chr(full.names, ~ str_split(.x, ' ')[[1]][1]),
    last.names = map_chr(full.names, ~ str_split(.x, ' ')[[1]][2]) %>%
      replace_na('')
  ) %>%
  select(-x) %>%
  arrange(id)

Я могу включить логику, что если есть один last.names, он объединит его со вторым first.names, чтобы получить тот же результат, но я неЯ думаю, это то, что вы хотите.Вектор с first.names, у которого нет second.names, может решить проблему.

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