r中的嵌套和连接值

时间:2019-02-20 02:33:32

标签: r concatenation

我试图取消嵌套每个单元格不一定具有相同数量值的两个列,然后将两个列之间具有对应关系的值连接起来。例如:

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 :(得分:0)

检查此解决方案:

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的向量可以解决此问题。