डेटा फ़्रेम की एक पंक्ति को वेक्टर में बदलें


116

मैं डेटा फ़्रेम की एक पंक्ति से एक वेक्टर बनाना चाहता हूं। लेकिन मुझे पंक्ति और स्तंभ नामों की आवश्यकता नहीं है। मैंने कई चीजों की कोशिश की ... लेकिन कोई भाग्य नहीं था।

यह मेरा डेटा फ़्रेम है:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

मैंने कोशिश की:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

लेकिन मैं वास्तव में कुछ इस तरह देखना चाहता हूं:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

मेरा सुझाव है कि आपने ठीक से दिखाए गए डेटा को प्रारूपित किया है। लगता है कि आप कुछ लाइन ब्रेक याद कर रहे हैं।
चिन्मय पाटिल

मुझे एक पंक्ति चाहिए। पंक्ति '1' और कॉलम 'ए' नहीं।
जोको

क्या एक डेटा फ्रेम की सभी पंक्तियों पर इसे लागू करने का एक तरीका है और इस तरह सभी वेक्टर को एक ही वेक्टर में मर्ज किया जा सकता है?
stephanmg

1
@stephanmg: कुछ के बारे में क्या पसंद है c(t(as.matrix(df))):?
एंड्री साइनोरेल

एंड्री: यह काम कर रहा है, हालांकि मैं इसे अलग तरीके से भी हल कर सकता हूं।
Stephanmg

जवाबों:


154

जब आप डेटा फ़्रेम से एकल पंक्ति निकालते हैं, तो आपको एक-पंक्ति डेटा फ़्रेम मिलता है। इसे सांख्यिक सदिश में बदलें:

as.numeric(df[1,])

जैसा कि @ रोलैंड सुझाव देता है, unlist(df[1,])एक-पंक्ति डेटा फ़्रेम को नामों को छोड़ने के बिना एक संख्यात्मक वेक्टर में बदल देगा। इसलिए unname(unlist(df[1,]))एक ही परिणाम के लिए एक और, थोड़ा और स्पष्ट तरीका है।

नीचे @Josh टिप्पणियों के रूप में, यदि आपके पास एक पूरी तरह से संख्यात्मक (वर्णक्रमीय, कारक, मिश्रित ...) डेटा फ़्रेम नहीं है, तो आपको as.character(df[1,])इसके बजाय की आवश्यकता है ।


यह ओपी को कोड देने के लिए +1 (या 0 डाउन-वोट) हो सकता है, जिसमें स्पष्ट रूप से चित्रित किया गया था कि वे क्या चाहते थे, भले ही प्रश्न का पाठ और शीर्षक विकृत हो गया हो ...
बेन बोल्कर

@ChinmayPatil, उनके अन्य विकल्प क्या हैं? उनका कोड उदाहरण निश्चित रूप से ऐसा दिखता है जैसे वे चाहते हैं।
बेन बोल्कर

2
यह ध्यान दिया जाना चाहिए कि एक डेटा फ़्रेम पहले से ही एक वेक्टर है और इसलिए as.vector देखता है कि यह "सूची" मोड का वेक्टर है और कुछ भी नहीं करता है। अंतर्निहित तंत्र को समझने की सुविधा के लिए as.vector (df [1,], मोड = "न्यूमेरिक") आज़माएं, जो अधिक उदाहरण के लिए है। ऐसा ही है।

1
कोई दिक्कत नहीं है। मैं केवल यह कह रहा हूं कि इस समस्या के लिए वे बिल्कुल वही जवाब देते हैं।
बेन बोल्कर

1
इस बीच बदल दिया गया हो सकता है, लेकिन आज अनलिस्ट नाम छोड़ने की अनुमति देता है: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (और btw df अभी भी एक डेटा नाम के लिए एक समझदार नाम नहीं है ... ;-))
एंड्री

45

मैं सलाह देता हूं unlist, जो नाम रखता है।

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

यदि आप एक नामित वेक्टर नहीं चाहते हैं:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

यदि आप संख्यात्मक को बदलना नहीं चाहते हैं तो आप यह कोशिश कर सकते हैं।

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
यह मेरे लिए बहुत मतलब नहीं है: str(as.vector(t(df)[,1]))है num [1:3] 1 2 2.6, यानी अपने कोड है एक अंकीय वेक्टर के लिए परिणाम परिवर्तन करते हैं ...
बेन Bolker

2
विशेष रूप से, जब आप t(df)R का उपयोग करते हैं तो डेटा फ़्रेम को मैट्रिक्स में ले जाते हैं, इस मामले में एक संख्यात्मक मैट्रिक्स क्योंकि सभी तत्व संख्यात्मक होते हैं। फिर [,1]पहला कॉलम (एक संख्यात्मक वेक्टर, क्योंकि निरर्थक आयाम स्वचालित रूप से हटा दिया जाता है) निकालता है। as.vector()सिर्फ नाम छोड़ता है (जो आप भी कर सकते थे unname())।
बेन बोल्कर

यह पात्रों के लिए भी काम करने लगता है। लेकिन आप तालमेल के बारे में सही हैं। एफडब्ल्यूआईडब्ल्यू, मेरा समाधान चरित्र डेटा फ़्रेम पर भी काम करेगा .. सभी डेटा के
कैरेट के साथ

2
मैं कहूंगा कि unname(unlist(x))समाधान थोड़ा बेहतर (अधिक कुशल और अधिक पारदर्शी) है।
बेन बोल्कर

as.vector(t(df)[,1])मुझे यह पसंद है ! वास्तव में मुझे इसकी क्या आवश्यकता है!
उथर पेंड्रैगन

7

यहाँ एक dplyrआधारित विकल्प है:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

ध्यान दें कि यदि आपकी पंक्ति में कोई कारक है तो आपको सावधान रहना होगा। यहाँ एक उदाहरण है:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

यहाँ एक और उदाहरण है (डिफ़ॉल्ट data.frame द्वारा) वर्णों को कारकों में परिवर्तित करता है)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

इस व्यवहार को रोकने के लिए, आपको इसे निकालने से पहले कारक का ध्यान रखना होगा:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

डेटा फ़्रेम के कॉलम पहले से ही वैक्टर हैं, आपको बस उन्हें बाहर निकालना होगा। ध्यान दें कि आप कॉलम को कॉमा के बाद चाहते हैं, इससे पहले नहीं:

> newV <- df[,1]
> newV
[1] 1 2 4 2

यदि आप वास्तव में एक पंक्ति चाहते हैं, तो बेन ने क्या कहा और कृपया भविष्य में शब्दों का सही उपयोग करें।


लेकिन मुझे लगता है कि ओपी पहली पंक्ति चाहता है ?
बेन बोल्कर

1
@BenBolker हो सकता है इसलिए ... मैंने बस यह मान लिया था कि वह वही चाहता था जो उसका शीर्षक और सवाल उसने कहा था।
जोनाथन क्रिस्टेंसेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.