आर

2010-02-14 10 views
6

में विश्लेषण के लिए जेएसओएन सूची-शब्दकोशों का स्थानांतरण करना मेरे पास प्रयोगात्मक डेटा प्रत्येक प्रयोग के लिए कुंजी-मूल्य जोड़े के चित्रों के रूप में व्यक्त किया गया है। संबंधित प्रयोगों का एक सेट जेएसओएन में इन डिक्ट्स की सूची के रूप में क्रमबद्ध है। यह rjson पैकेज के माध्यम से अनुसंधान में में parseable है, लेकिन डेटा एक रूप है जिसमें चुनौतीपूर्ण है में भरी हुई है as.data.frame(data) पैदावार के साथ सीधे एक data.frame में इस बारी करने का प्रयास करआर

data <- fromJSON('[{"k1":"v1","k2":"v2"}, {"k1":"v3","k2":"v4"}]') 

पैदावार

[[1]] 
[[1]]$k1 
[1] "v1" 

[[1]]$k2 
[1] "v2" 


[[2]] 
[[2]]$k1 
[1] "v3" 

[[2]]$k2 
[1] "v4" 

विश्लेषण करने के लिए :

k1 k2 k1.1 k2.1 
1 v1 v2 v3 v4 

स्पष्ट रूप से एक फ्लैट 1-आयामी सूची के रूप में सभी प्रयोगों के पार कुंजी/मान जोड़े के अनुक्रम को देखने।

क्या मैं चाहता हूँ प्रत्येक प्रयोग के लिए एक पंक्ति के साथ एक और अधिक परंपरागत तालिका, और प्रत्येक अद्वितीय कुंजी के लिए एक स्तंभ है:

k1 k2 
1 v1 v2 
2 v3 v4 

मैं कैसे सफाई से इस अनुसंधान में परिणत व्यक्त कर सकते हैं?

उत्तर

11

l*ply फ़ंक्शन प्रोसेसिंग के साथ करते समय आपका सबसे अच्छा दोस्त हो सकता है। इस प्रयास करें:

> library(plyr) 
> ldply(data, data.frame) 
    k1 k2 
1 v1 v2 
2 v3 v4 

plyr अनियमित सूचियों (जैसे जब प्रत्येक सूची तत्वों का एक ही नंबर शामिल नहीं है) जैसी चीजों से निपटने के लिए पर्दे के पीछे कुछ बहुत अच्छा प्रसंस्करण करता है। यह जेएसओएन और एक्सएमएल के साथ बहुत आम है, और आधार कार्यों के साथ संभालना मुश्किल है।

या वैकल्पिक रूप से का उपयोग कर आधार कार्य:

> do.call("rbind", lapply(data, data.frame)) 

आप (plyr से) rbind.fill उपयोग कर सकते हैं rbind के बजाय यदि आप अनियमित सूचियों है, लेकिन मैं तो बस शुरू से ही plyr का उपयोग कर अपने जीवन को आसान बनाने के लिए सलाह देंगे ।

संपादित करें:

अपने अधिक जटिल उदाहरण के बारे में, यह आसानी से साथ हेडली के सुझाव सौदों का उपयोग कर:

> x<-list(list(k1=2,k2=3),list(k2=100,k1=200),list(k1=5, k3=9)) 
> ldply(x, data.frame) 
    k1 k2 k3 
1 2 3 NA 
2 200 100 NA 
3 5 NA 9 
+0

प्लीयर समाधान की तरह, क्योंकि यह प्रत्येक अवलोकन के लिए एक अलग क्रम में दिखाई देने वाले चर से निपट सकता है। मुझे पागलपन कहते हैं, लेकिन मैं कुछ अवलोकनों के बारे में चिंतित था कि कुछ चर नहीं हैं। यहां एक भिन्नता है जो बहुत बुरे मामलों के लिए भी नहीं तोड़ती है: x <-list (सूची (k1 = 2, k2 = 3), सूची (k2 = 100, k1 = 200), सूची (k1 = 5)) ; ldply (x, function (z) as.data.frame (टी (असूची (जेड))) –

+2

मुझे लगता है कि एक बेहतर समाधान 'ldply (x, data.frame) ' – hadley

+0

है, मैं हमेशा प्लीयर समाधान चुनता हूं:) –

4

यह दिलचस्प है। पाइथन कोड को ठीक करने का सबसे आसान तरीका यह है कि निर्देश को और आसानी से बदला जा सकता है।

लेकिन, इसके बारे में कैसे?

k1 <- unlist(lapply(data,FUN=function(x){return(x[[1]])})) 
k2 <- unlist(lapply(data,FUN=function(x){return(x[[2]])})) 
data.frame(k1,k2) 

आप अभी भी डेटा प्रकार सही में k1 और k2 कास्ट करने के लिए की आवश्यकता होगी, लेकिन यह पूरा करना चाहिए कि आप क्या देख रहे हैं।

+2

एक क्लीनर सामान्यीकरण आप स्तंभों का एक बहुत हो जाएगा यदि: newdata <- लापरवाही (1: लंबाई (डेटा [[1]]), फ़ंक्शन (एक्स) असूचीबद्ध (लापरवाही (डेटा, "[[", x))); newdata <- as.data.frame (newdata); नाम (newdata) <- नाम (डेटा [[1]]) – brentonk

+0

मैं स्पष्ट रूप से जेएसओएन को लोड करने से पहले इसे स्थानांतरित करने के लिए पूर्व-प्रोसेस कर सकता हूं, लेकिन समस्या यह है कि मैं इसे "फिक्सिंग" के रूप में नहीं देखता: एक सूची dicts _is_ इस डेटा के बारे में सोचने का सबसे स्वाभाविक तरीका है।सूचियों का एक नियम पंक्ति-उन्मुख सॉफ़्टवेयर के लिए इसे और अधिक सुविधाजनक तरीका है, इसे इसके बारे में सोचने का सबसे अच्छा तरीका नहीं है। और मैन्युअल रूप से प्रत्येक प्रविष्टि को अनपॅक करना अस्थिर है। हालांकि, ब्रेटनक की विधि काम करती है। (मुझे स्पष्ट रूप से अन्य चीजों के साथ सादे सबसेट ('[') के विपरीत '[[' 'के अर्थ को बेहतर तरीके से समझने की आवश्यकता है।) – jrk

+0

मेरा समाधान दो कॉलम के लिए काम करता है, जो स्पष्ट रूप से आपके प्रश्न का निहित है। यदि आपके पास कई कॉलम हैं, तो निश्चित रूप से आपको सामान्यीकरण का उपयोग करने की आवश्यकता है, जैसे ब्रेंटोन्क की विधि। –