2016-08-09 19 views
7

एक डेटा फ्रेम मैं उपयोग कर सकते हैं unnest करने में सूचियों की एक सूची Unnesting:एक डेटा फ्रेम स्तंभ

df <- data_frame(
    x = 1, 
    y = list(a = 1, b = 2) 
) 

tidyr::unnest(df) 

लेकिन यह कैसे मैं एक डेटा फ्रेम स्तंभ के अंदर एक सूची के अंदर एक सूची unnest कर सकते हैं?

df <- data_frame(
    x = 1, 
    y = list(list(a = 1, b = 2)) 
) 
tidyr::unnest(df) 

त्रुटि:

Each column must either be a list of vectors or a list of data frames [y]

+2

क्या परिणाम की तरह दिखना चाहिए? –

+0

पहले कोड खंड के समान। 'data_frame (x = c (1, 1), y = c (1, 2))' – emehex

+0

यदि आप विस्तृत होने की कोशिश कर रहे हैं, तो 'df%>% mutate (y = list (as.data.frame (y)))%>% unnest() 'लंबे समय तक, शायद 'df%>% do (data_frame (x =। $ x, y = असूची (। $ y))) या' df%>% mutate (y = डेटा_फ्रेम (असूची (वाई)))%>% अनन्य() ' – alistaire

उत्तर

11
purrr, जो सूचियों के लिए अच्छा है के साथ

,

library(purrr) 

df %>% dmap(unlist) 
## # A tibble: 2 x 2 
##  x  y 
## <dbl> <dbl> 
## 1  1  1 
## 2  1  2 

को कमोबेश

as.data.frame(lapply(df, unlist)) 
## x y 
## a 1 1 
## b 1 2 

012 के बराबर है

अद्यतन:

dmap पदावनत किया गया है और purrrlyr में ले जाया गया, दिलचस्प लेकिन बदकिस्मत कार्यों का घर है कि अब आप कम से प्रतिवाद चेतावनी के बहुत सारे चिल्लाना होगा। आप tidyverse के आधार आर मुहावरा उसका अनुवाद कर सकें:

df %>% map(unlist) %>% as_data_frame() 

जो इस मामले के लिए ठीक काम करेंगे, लेकिन एक से अधिक पंक्ति (एक समस्या इन सभी दृष्टिकोणों का सामना) के लिए नहीं। एक और अधिक मजबूत समाधान हो सकता है

library(tidyverse) 

df %>% bind_rows(df) %>% # make larger sample data 
    mutate_if(is.list, simplify_all) %>% # flatten each list element internally 
    unnest() # expand 
#> # A tibble: 4 × 2 
#>  x  y 
#> <dbl> <dbl> 
#> 1  1  1 
#> 2  1  2 
#> 3  1  1 
#> 4  1  2 
संबंधित मुद्दे