एक वेक्टर में data.frame स्तंभ में कनवर्ट करें?


163

मेरे पास एक डेटाफ्रेम है:

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

मैंने निम्नलिखित में से किसी एक कॉलम को वेक्टर में बदलने की कोशिश की, लेकिन यह काम नहीं करता है:

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

यह एकमात्र उपाय है जिसके साथ मैं आ सकता था, लेकिन मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए:

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

नोट: उपरोक्त मेरी शब्दावली बंद हो सकती है, इसलिए कृपया मुझे ठीक करें यदि ऐसा है तो। मैं अभी भी आर की दुनिया सीख रहा हूं। इसके अलावा, यहां जो भी हो रहा है, उसकी कोई भी व्याख्या की सराहना की जाती है (यानी पायथन या कुछ अन्य भाषा से संबंधित मदद मिलेगी)!


5
जैसा कि आप उत्तरों में देख रहे हैं, एक निकट रीडिंग ?'[.data.frame'आपको बहुत दूर ले जाएगी।
जोरन

जवाबों:


208

मैं बिना किसी गलती के इसे समझाने का प्रयास करने जा रहा हूं, लेकिन मैं शर्त लगा रहा हूं कि यह एक स्पष्टीकरण या टिप्पणी में दो को आकर्षित करेगा।

डेटा फ्रेम एक सूची है। जब आप किसी कॉलम के नाम का उपयोग करके डेटा फ़्रेम को सब्मिट[ करते हैं और , जो आपको मिल रहा है वह सबलिस्ट (या सब डेटा फ्रेम) है। यदि आप वास्तविक परमाणु स्तंभ चाहते हैं, तो आप उपयोग कर सकते हैं [[, या कुछ हद तक भ्रमित कर सकते हैं (मेरे लिए) आप ऐसा कर सकते हैं aframe[,2]जो एक वेक्टर लौटाता है, एक सबलिस्ट नहीं।

इसलिए इस क्रम को चलाने की कोशिश करें और शायद चीजें साफ हो जाएंगी:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)

6
+1 यह उपयोगी है। मैं aframe[,"a2"]डेटा फ्रेम और मैट्रीस दोनों के साथ इस का उपयोग करने की क्षमता के कारण उपयोग करने के लिए इस्तेमाल किया था और एक ही परिणाम प्राप्त करने के लिए लग रहे थे - एक वेक्टर।
Iterator

8
[..., drop = F]हमेशा एक डेटा फ्रेम
लौटाएंगे

1
यह जानना विशेष रूप से अच्छा है क्योंकि df$xवाक्यविन्यास एक वेक्टर देता है। मैंने लंबे समय तक इस सिंटैक्स का उपयोग किया था, लेकिन जब मुझे स्तंभों का उपयोग करना df['name']या df[n]पुनः प्राप्त करना शुरू करना था , तो मैंने समस्याओं को मारा जब मैंने उन्हें वैक्टर वाले कार्यों को भेजने की कोशिश की। सही चीजों का उपयोग करना df[[n]]या df[['x']]साफ करना ।
रेंस

8
क्यों as.vectorलगता है चुपचाप कोई प्रभाव नहीं है? यह या तो एक वेक्टर नहीं लौटना चाहिए या विशिष्ट रूप से असफल?
bli

aframe[['a2']]sfवस्तुओं के साथ बहुत उपयोगी है क्योंकि aframe[,"a2"]दो कॉलम वापस आएंगे क्योंकि ज्यामिति कॉलम शामिल है।
मैट


32

आप $निष्कर्षण का उपयोग कर सकते हैं :

class(aframe$a1)
[1] "numeric"

या डबल वर्ग ब्रैकेट:

class(aframe[["a1"]])
[1] "numeric"

21

आपको आवश्यकता नहीं है as.vector(), लेकिन आपको सही अनुक्रमण की आवश्यकता है:avector <- aframe[ , "a2"]

इसके बारे में पता करने के लिए एक और चीज drop=FALSEहै [:

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
  a1 a2 a3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1]  6  7  8  9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
  a2
1  6
2  7
3  8
4  9
5 10
R> 

4
+1: का अनुस्मारक drop=FALSEउपयोगी है - इससे मुझे उन मामलों में मदद मिलती है, जहां मैं data.frame से N कॉलम का चयन कर सकता हूं, उन मामलों में जहां = 1।
Iterator

मैं इसका उपयोग तब करता हूं जब मैं चयनित कॉलमों की संख्या का पूर्वाभास नहीं कर सकता और यदि कोई कॉलम आता है, तो परिणाम अभी भी n. कॉलम के साथ डेटा के रूप में पारित हो जाता है। एक वेक्टर एक बंदर रिंच को कार्यों के नीचे लाइन में फेंक सकता है।
रोमन लुसेट्रिक

11

'[[' ऑपरेटर का उपयोग करने का एक और फायदा यह है कि यह data.frame और data.table दोनों के साथ काम करता है। तो अगर फ़ंक्शन को data.frame और data.table दोनों के लिए चालू किया जाना है, और आप एक वेक्टर के रूप में उसमें से एक कॉलम निकालना चाहते हैं

data[["column_name"]] 

श्रेष्ठ है।


8

आप कुछ इस तरह की कोशिश कर सकते हैं-

as.vector(unlist(aframe$a2))

यदि आप दो स्तंभों की तुलना करना चाहते हैं तो यह अच्छा है identical
पी-रोबोट

5

यदि आप सिर्फ निकालने के ऑपरेटर का उपयोग करते हैं तो यह काम करेगा। डिफ़ॉल्ट रूप से, [] विकल्प सेट करता है drop=TRUE, जो आप यहाँ चाहते हैं। ?'['अधिक जानकारी के लिए देखें।

>  a1 = c(1, 2, 3, 4, 5)
>  a2 = c(6, 7, 8, 9, 10)
>  a3 = c(11, 12, 13, 14, 15)
>  aframe = data.frame(a1, a2, a3)
> aframe[,'a2']
[1]  6  7  8  9 10
> class(aframe[,'a2'])
[1] "numeric"


3
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
avector <- as.vector(aframe['a2'])

avector<-unlist(avector)
#this will return a vector of type "integer"

2

मैं डेटाफ़्रेम को फ़िल्टर करने के लिए सूचियों का उपयोग करता हूँ चाहे उनके पास%% एक सूची में मान हो या न हो।

मैं मैन्युअल रूप से Excel में 1 कॉलम डेटाफ़्रेम निर्यात करके सूचियाँ बना रहा था, जहाँ मैं R: सूची में चिपकाने से पहले, प्रत्येक तत्व के आसपास "" जोड़ूंगा, <- c ("el1", "el2", ...) जो आमतौर पर था। उसके बाद FilteredData <- सब्मिट (डेटा, कॉलम%% सूची में)।

स्टैकओवरफ़्लो की खोज करने और 1 कॉलम डेटाफ़्रेम को एक सूची में बदलने के लिए एक सहज तरीका नहीं ढूंढने के बाद, मैं अब अपना पहला स्टैकवॉटरफ़्लो योगदान पोस्ट कर रहा हूं:

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")

1

हम डेटा.फ्रेम कॉलम को एक साधारण वेक्टर में भी रूपांतरित कर सकते हैं। as.vectorपर्याप्त नहीं है क्योंकि यह डेटा.फ्रेम क्लास और संरचना को बरकरार रखता है, इसलिए हमें पहला (और केवल) तत्व बाहर निकालना होगा:

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

अब तक सुझाए गए सभी समाधानों में हार्डकोडिंग कॉलम टाइटल की आवश्यकता होती है। यह उन्हें गैर-जेनेरिक बनाता है (कार्य तर्क के लिए इसे लागू करने की कल्पना करें)।

वैकल्पिक रूप से, आप निश्चित रूप से पहले कॉलम से कॉलम के नाम पढ़ सकते हैं और फिर उन्हें अन्य समाधानों में कोड में डाल सकते हैं।

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