2012-05-03 10 views
21
से

मैं एक त्वरित तरीका है आगे और पीछे निम्न स्वरूप की एक सूची के बीच पाने के लिए देख रहा हूँ के नाम सूची:करने के लिए/Data.Frame

$`a` 
    [1] 1 2 3 
$`b` 
    [1] 4 5 6 

को/निम्न स्वरूप की एक data.frame से :

name x 
1 a 1 
2 a 2 
3 a 3 
4 b 4 
5 b 5 
6 b 6 

(वास्तव में परवाह नहीं क्या कॉलम के नाम इस मामले में, कर रहे हैं।)

यहाँ आर प्रारूप में ऊपर इस्तेमाल किया डेटा फ्रेम है:

df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6)) 

फिर से, मैं दो अलग-अलग कार्यों के लिए देख रहा हूँ: एक एक सूची के लिए ऊपर data.frame कन्वर्ट करने के लिए, और एक अन्य यह एक data.frame वापस करने के लिए कन्वर्ट करने के लिए।

उत्तर

26

उपयोग stack और unstack आधार आर में:

x <- data.frame(a=1:3, b=4:6) 

x 
    a b 
1 1 4 
2 2 5 
3 3 6 

उपयोग stack को विस्तृत से लंबा है, यानी करने के लिए एक दूसरे के ऊपर पर वैक्टर टिके रहते हैं।

y <- stack(x) 
y 
    values ind 
1  1 a 
2  2 a 
3  3 a 
4  4 b 
5  5 b 
6  6 b 

उपयोग unstack रिवर्स करने के लिए।

unstack(y) 
    a b 
1 1 4 
2 2 5 
3 3 6 

यदि आपका डेटा संरचना की तुलना में आप का वर्णन किया, stack और unstack अब उपयुक्त हो सकता है अधिक जटिल है। उस मामले में आप पैकेज reshape2 में आधार आर में reshape, या melt और dcast का उपयोग करना होगा।

7

हो सकता है कि कुछ इस तरह:

X <- split(df$x, df$name) 
data.frame(name = rep(names(X), sapply(X, length)), 
    x=do.call('c', X)) 

संपादित करें:मैं एक वास्तव में क्या ओ पी काफी सरल के लिए कहा प्रतीत होता है कि में Andrie और मैं समाधान गठबंधन का फैसला किया। कहा जा रहा है मैं काफी एक स्थिति है जहाँ मैं डेटा के बजाय के बाद से एक डेटा फ्रेम बराबर लंबाई वैक्टर की एक सूची भी है कैसे Andrie यह किया इस तरह का इलाज होगा समझ में नहीं आता।

# Your data set 
df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6)) 

# converting it to list of vectors 
X <- split(df[, 2], df[, 1]) 
# converting it to a dataframe 
Y <- stack(X)[, 2:1]; names(Y) <- names(df) 

# Take Y and feed it back to these lines to show it 
# switches back and forth 
(X <- split(Y[, 2], Y[, 1])) 
Y <- stack(X)[, 2:1]; names(Y) <- names(df);Y 
+0

+1 मैं सोच रहा था कि डेटा फ्रेम पर वापस जाने के लिए शायद 'melt (as.data.frame (...), value.name =' x ', variable.name =' name ')' पिघल रहा था। – joran

+0

किसी को ध्यान रखना चाहिए कि विभाजन डेटा फ्रेम को पीछे छोड़ देता है क्योंकि यह दूसरे वेक्टर का कारक बनाता है। यह भी देखें [समाधान के लिए दो वैक्टर (नाम, मान) से नामित सूची बनाना] (http://stackoverflow.com/questions/17842705/creating-a-named-list-from-two-vectors-names-values) समाधान के लिए 'mapply' का उपयोग कर। – jnas

2

मैं उम्मीद है कि गैर तुच्छ टिप्पणी कि @Tyler Rinker के सुझाव

X <- split(df$x, df$name) 

साथ

X <- split(df, df$name) 

@Tyler Rinker के विभाजन() स्पष्टीकरण अधिक आम तौर पर किया जा सकता है करना चाहते हैं आर रसोई की किताब से मेल खाता है

http://my.safaribooksonline.com/book/programming/r/9780596809287/6dot1dot-splitting-a-vector-into-groups/id3392005

specifyin जी कि एक वेक्टर, बांटा जा सकता है, जबकि वास्तव में पूरे dataframe बांटा जा सकता है। मैं (और तथ्य यह है कि मुझे क्या इस पोस्ट के लिए लाया में) सोच सकता है कि dataframe, नहीं वेक्टर समूहीकरण, और अधिक महत्वपूर्ण उपकरण होगा।

(df <- data.frame(name=c(rep("a",3),rep("b",3), rep("c",3)), x=c(1:3,4:6, 7:9))) 
(X <- split(df, df$name)) 

एचटीएच।

संबंधित मुद्दे