如何在tidyr中使用nest()来折叠多行

san*_*oku 1 r dplyr tidyr

我有这样的数据框

df=data.frame(a=rep(c("x","y"),2),b=c("Rome", "Venice", "Barcelona", "Paris"))
Run Code Online (Sandbox Code Playgroud)

我希望按列a嵌套b,以便显示

x  Rome, Barcelona
y  Venice, Paris
Run Code Online (Sandbox Code Playgroud)

然而,这似乎没有做到这一点.任何建议?

如建议

df$b=as.character(df$b)
df=as.data.frame(df %>% group_by(a) %>% nest(b))
Run Code Online (Sandbox Code Playgroud)

但是df的新数据列似乎是tbl_df格式,结果是这样的

a  data
x  list(b = c("Rome", "Barcelona")
Run Code Online (Sandbox Code Playgroud)

有没有办法使新的嵌套列只是正常的字符串组合?

Mar*_*son 6

如果您没有结合tidyr/ nest解决方案,只需dplyr使用以下方法即可:

df %>%
  group_by(a) %>%
  summarise(b = paste(b, collapse = ", "))
Run Code Online (Sandbox Code Playgroud)

返回:

       a               b
  <fctr>           <chr>
1      x Rome, Barcelona
2      y   Venice, Paris
Run Code Online (Sandbox Code Playgroud)

如果你想使用nest,你可以使用map_chrfrom purrr来做你想要的:

df %>%
  mutate(b = as.character(b)) %>%
  nest(b) %>%
  mutate(cityList = map_chr(data, ~paste(.$b, collapse = ", "))) %>%
  select(-data)
Run Code Online (Sandbox Code Playgroud)

请注意,正如@ joel.wilson指出的那样,为此,如果它们是一个因素,您可能需要将城市名称显式转换为字符.它返回:

       a        cityList
  <fctr>           <chr>
1      x Rome, Barcelona
2      y   Venice, Paris
Run Code Online (Sandbox Code Playgroud)