【问题标题】:Unnest and concatenate values in rr中的非嵌套和连接值
【发布时间】:2019-07-13 15:35:21
【问题描述】:

我正在尝试取消嵌套每个单元格的值并不总是相同数量的两列,然后连接在两列之间具有对应关系的值。例如:

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 中没有值的问题

有没有更好的方法来做到这一点?

【问题讨论】:

  • 数据中的一个问题是最后一行“last.names”只有一个条目。你如何决定它应该与'first.names'中的'Creed'或'Jim'一起使用。这是基于“吉姆”的早期条目。但是当有人姓氏相同时,这可能会导致问题
  • 这是我面临的一个问题,目前,我知道只有某些名字没有姓氏。我在想也许字典会有所帮助,但这更多是我的 python 背景......我正在尝试运行你的代码,安装 tidyverse 包时遇到问题

标签: r concatenation


【解决方案1】:

检查这个解决方案:

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 可以解决这个问题。

【讨论】:

  • Chabros 您的解决方案非常接近,它遇到了我遇到的类似问题。最终输出的第 6 行和第 7 行不正确。 firstname 'Creed' 永远不会有 last.name,并且 first.name 'Jim' 应该始终与 last.name 'Halpert' 相关联
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2012-03-18
  • 2014-05-31
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多