2010-03-06 15 views
5

में कनवर्ट करना मैं टेक्स्ट की कई पंक्तियों को डेटा फ्रेम में परिवर्तित करने का एक तरीका ढूंढने का प्रयास कर रहा हूं। मुझे यकीन नहीं है कि क्या कोई तरीका है जहां आप टेक्स्ट की कई पंक्तियों में पढ़ने के लिए read.delim() का उपयोग कर सकते हैं और rehape() जैसी कुछ डेटा फ्रेम बना सकते हैं?टेक्स्ट फ्रेम की एक पंक्ति में डेटा फ्रेम

डेटा इस प्रकार संरचित है:

A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 

मैं कुछ है कि निम्न डेटा फ्रेम की तरह दिखता है के लिए इस डेटा रूपांतरित करना चाहते हैं:

A    B    C 
1    2    10 
34   20   6.7 
2    78   35 

क्षमा याचना अगर वहाँ एक स्पष्ट तरीका है यह करने के लिए!

उत्तर

9

के साथ खेल से सिर्फ कर रहा है कैसे के बारे में:

s<-"A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 
" 
d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE) 
cols<-levels(d[,'V1']) 
d<-data.frame(sapply(cols,function(x) {d['V2'][d['V1']==x]}, USE.NAMES=TRUE)) 

जो पैदावार:

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 
+0

पढ़ना चाहेंगे जो 'sapply() 'का चालाक उपयोग था। मैंने पहले इस तरह से इसका उपयोग करने के बारे में सोचा नहीं था। – andrewj

+0

धन्यवाद। मैं सिर्फ आर सीखना शुरू कर रहा हूं, इसलिए मुझे अपने निपटान में कुछ औजारों का उपयोग करने की कोशिश करनी पड़ी। :) मैंने अभी 'अनस्टैक' का उपयोग करके अपना समाधान देखा है। यह मेरे लिए सबसे अच्छा तरीका दिखता है। – unutbu

+0

यह सहायक पाया क्योंकि मुझे टेक्स्ट-स्ट्रिंग '" ए; लोरेम \ nb; ipsum \ nc; gecko "को डेटा.फ्रेम में परिवर्तित करने की आवश्यकता थी और यह' textConnection() '-फंक्शन के साथ काम करता था जिसे मैं नहीं जानता था । – schlusie

0

यहाँ नयी आकृति प्रदान का उपयोग कर एक समाधान है

s<-"A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 
" 
d<-d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE) 
N<-nrow(d)%/%3 
d$id<-rep(1:N,each=3) 
reshape(d,dir="wide",timevar="V1",idvar="id") 

कौन सा

id V2.A V2.B V2.C 
1 1 1 2 10.0 
4 2 34 20 6.7 
7 3 2 78 35.0 
4

का उत्पादन यहाँ कैसे plyr पैकेज के साथ यह करने के लिए है:

require("plyr") 
my.data <- "A: 1 
      B: 2 
      C: 10 
      A: 34 
      B: 20 
      C: 6.7 
      A: 2 
      B: 78 
      C: 35" 
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE) 

as.data.frame(dlply(df,.(V1),function(x) x[[2]])) 

आप

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 
मिल

आप देख सकते हैं क्या जादू plyr dlply(df,.(V1)) या dlply(df,.(V1),function(x) x)

+0

'प्लीयर' सुझाव के लिए धन्यवाद। निश्चित रूप से आगे की खोज लायक है। मुझे 'अनस्टैक' – andrewj

+0

आह, अच्छा कॉल का उपयोग करके मेरे प्रश्न को हल करने का विकल्प मिला; इस मामले में शायद जाने का रास्ता है। हालांकि, अन्य "समूह द्वारा" प्रकार के संचालन के लिए, प्लीर आसान हो सकता है। यदि आप आगे का पता लगाना चाहते हैं तो आप http://had.co.nz/plyr/plyr-intro-090510.pdf –

2

मैं आर-अप के संबंध में इस प्रश्न पोस्ट साथ ही, और फिल स्पेक्ट्रर से unstack का सुझाव देने का जवाब मिला।

इसी कारण से लियो Alekseyev की प्रतिक्रिया

my.data <- "A: 1 
      B: 2 
      C: 10 
      A: 34 
      B: 20 
      C: 6.7 
      A: 2 
      B: 78 
      C: 35" 
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE) 
unstack(df, V2 ~ V1) 

इस परिणाम में एक संशोधन है:

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 

इस दृष्टिकोण अन्य विचारशील जवाब की तुलना के कुछ लाभ है कि आप निर्दिष्ट करने की आवश्यकता नहीं है समय से पहले कॉलम की संख्या। इसे किसी भी अतिरिक्त पैकेज की आवश्यकता नहीं है।

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