2010-11-18 11 views
11

क्या आर में प्रत्येक पंक्ति को तारों में प्रत्येक पंक्ति को परिवर्तित करने के लिए आर में "पंक्ति द्वारा" ऑपरेशन है?आर में: पंक्ति से वेक्टर तत्वों में शामिल होना, वेक्टर पंक्तियों को तारों में परिवर्तित करना

> d= cbind("Data", c("2", "73")) 
> d 
    [,1] [,2] 
[1,] "Data" "2" 
[2,] "Data" "73" 

मैं क्या चाहता हूँ की तरह

 [,1] 
[1,] "Data 2" 
[2,] "Data 73" 

तार प्राप्त करने के लिए है वहाँ एक आसान तरीका पंक्ति द्वारा आइटम शामिल होने के लिए है?

उत्तर

18

हां, वहां है। यह "लागू करें" ;-)

apply(d,1,paste,collapse=" ") 
[1] "Data 2" "Data 73" 
# convert to matrix using as.matrix to get exactly your solution 

?apply और ?paste

+0

ब्लॉगर, ज़ाहिर है, लागू, डुह :(लेकिन पेस्ट, पतन = "" भाग मैंने कभी नहीं सोचा होगा, धन्यवाद :) – gakera

+0

@gakera: 'collapse = "' 'भाग को चित्रित करना बहुत आसान है यदि आप दस्तावेज 'पेस्ट' दस्तावेज पढ़ते हैं। –

+0

सहायता में संकुचन = "" उपयोग के किसी भी उदाहरण शामिल नहीं हैं, कम से कम मेरे संस्करण में नहीं। लेकिन पाठ से यह स्पष्ट है कि यह क्या करता है, एक बार जब आप इसे सभी शोर में देखते हैं। – gakera

3

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

> paste(d[,1],d[,2]) 
[1] "Data 2" "Data 73" 
+0

लेकिन मुझे एक सामान्य तरीका चाहिए जो पंक्तियों को स्पष्ट रूप से निर्दिष्ट किए बिना काम करता है। मुझे खेद है कि मैं इसके बारे में पर्याप्त स्पष्ट नहीं था, लेकिन आवेदन विधि जो मुझे करने की ज़रूरत है उसके लिए बहुत अच्छी तरह से काम करती है। – gakera

+0

+1: बहुत सच है। –

1

एक सामान्य तरीका ?apply का सहारा के बिना यह करने के लिए:

do.call(paste, as.data.frame(d)) 
[1] "Data 2" "Data 73" 

कहाँ as.data.frame सबस्क्रिप्ट से बचने के लिए प्रयोग किया जाता है।

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

do.call एक समारोह है जो पहले तर्क के रूप में एक और समारोह लेता है, और दूसरा तर्क के रूप में एक सूची है। इसे अक्सर कार्यों के लिए तर्कों की सूचियां भेजने के लिए उपयोग किया जाता है (हमारे मामले में, d के कॉलम paste())। इस काम को काम करने के लिए हम डेटा को डेटा.फ्रेम (एक प्रकार की सूची) के रूप में भेजते हैं।

+0

यह सच है। यदि डेटा पहले से ही डेटा था। दक्षता लाभ अधिक होगा, लेकिन 'लागू()' समाधान वेक्टरों के लिए बहुत तेज़ है। इस में लाभ यह है कि किसी को पेस्ट लगाने पर स्वयं को एक डेटा प्रकार से सीमित करने की आवश्यकता नहीं है, लेकिन बहुत सारे नुकसान भी हैं: उदाहरण के लिए, कॉलम के बजाए पंक्तियों द्वारा पेस्ट करने के लिए केवल 'लागू() में एक संख्या में परिवर्तन की आवश्यकता होती है। समाधान, जबकि इस के लिए प्रमुख कोड परिवर्तन की आवश्यकता है। कुल मिलाकर, यह समाधान केवल मेरे सामान्य उपयोग मामलों के लिए है, जहां मैंने 'expand.grid()' के साथ एक इंडेक्स किया था और इन्हें 'do.call (पेस्ट)' –

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