2016-12-06 44 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