2016-12-06 43 views
0

我有这样如何使用tidyr巢()折叠几行

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

的数据帧,我想巢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") 

有没有一种方法,使新的嵌套列平常心字符串组合?

+1

这个'aggregate(data = df,b〜a,toString)''怎么样? – user2100721

+0

as.data.frame(df%>%group_by(a)%>%nest(b)) –

回答

2

如果你不执着于一个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_chrpurrr做你想做的,以及什么:

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

需要注意的是,如@ joel.wilso n指出,为此,如果他们是一个因素,您可能需要明确地将城市名称转换为角色。它返回这个:

 a  cityList 
    <fctr>   <chr> 
1  x Rome, Barcelona 
2  y Venice, Paris 
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 
+0

并且有时在嵌套列变为之后:list(b = c(“Rome”,“Barcelona”))。为什么会发生? – santoku

+0

我没有得到你..你能分享一个可重复的例子吗?重新编辑问题本身 –

+0

感谢您的答复。编辑问题。 因此,如果运行 DF = as.data.frame(DF%>%GROUP_BY的(a)%>%巢(B)) 然后 STR(DF)它显示数据列作为这样tbl_df类: 数据 X 列表(b = C( “罗马”, “巴塞罗那”))Ÿ 列表(b = C( “威尼斯”, “巴黎”)) – santoku