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

时间:2016-12-06 15:44:47

标签: r dplyr tidyr

我有一个像这样的数据框

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

我希望按列a嵌套b,使其显示

x  Rome, Barcelona
y  Venice, Paris
然而,这似乎并没有成功。有什么建议吗?

如建议

df$b=as.character(df$b)
df=as.data.frame(df %>% group_by(a) %>% nest(b))

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

a  data
x  list(b = c("Rome", "Barcelona")

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

2 个答案:

答案 0 :(得分:6)

如果您没有使用tidyr / nest解决方案,只需dplyr即可使用以下方法执行此操作:

df %>%
  group_by(a) %>%
  summarise(b = paste(b, collapse = ", "))

返回:

       a               b
  <fctr>           <chr>
1      x Rome, Barcelona
2      y   Venice, Paris

如果您想使用nest,可以使用map_chr中的purrr来执行您想要的操作:

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

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

       a        cityList
  <fctr>           <chr>
1      x Rome, Barcelona
2      y   Venice, Paris

答案 1 :(得分:3)

确保column b是一个字符:然后执行以下操作,

as.data.frame(df %>% group_by(a) %>% nest(b))
#  a            data
#1 x Rome, Barcelona
#2 y   Venice, Paris

如果column b是一个因素:那么将输出水平

> class(df$b)
[1] "factor"
> df$b
[1] Rome      Venice    Barcelona Paris    
Levels: Barcelona Paris Rome Venice

> as.data.frame(df %>% group_by(a) %>% nest(b))
#  a data
#1 x 3, 1
#2 y 4, 2

根据您的要求进行更改:尝试以下代码:df1是来自as.data.frame()的o / p

df1 = df %>% group_by(a) %>% nest(b)    
df1$newcol = sapply(df1$data, function(x) paste(x$b, collapse = ","))
df1

       a           data         newcol
#  (fctr)          (chr)          (chr)
#1      x <tbl_df [2,1]> Rome,Barcelona
#2      y <tbl_df [2,1]>   Venice,Paris