किसी डेटा फ़्रेम से विशिष्ट कॉलम निकालना


365

मेरे पास 6 कॉलम के साथ एक आर डेटा फ्रेम है, और मैं एक नया डेटाफ्रेम बनाना चाहता हूं जिसमें केवल तीन कॉलम हैं।

अपने डेटा फ्रेम मानते हुए है df, और मैं निकालने कॉलम करना चाहते हैं A, Bऔर E, यह केवल आदेश मैं यह पता लगाने कर सकते हैं:

 data.frame(df$A,df$B,df$E)

क्या ऐसा करने का एक अधिक कॉम्पैक्ट तरीका है?

जवाबों:


156

यदि आपका डेटा.फ्रेम कहा जाता है, तो dplyr पैकेज का उपयोग करना df1:

library(dplyr)

df1 %>%
  select(A, B, E)

यह %>%पाइप के बिना भी लिखा जा सकता है :

select(df1, A, B, E)

2
अपने प्रश्न को पोस्ट करने के बाद से Tidyverse के काफी विकास को देखते हुए, मैंने आपके उत्तर को बदल दिया है।
ऐरेन कैम्ब्र

4
Tidyverse में परिवर्तन की उग्र दर को देखते हुए, मैं इस पैटर्न का उपयोग करने के खिलाफ चेतावनी दूंगा। यह कॉलम नामों के इलाज के खिलाफ मेरी मजबूत प्राथमिकता के अतिरिक्त है जैसे कि वे फ़ंक्शन, पैकेज या एप्लिकेशन के लिए कोड लिखते समय ऑब्जेक्ट नाम होते हैं।
जोशुआ उलरिच

1
यह उत्तर प्रस्तुत किए हुए चार साल से अधिक हो गए हैं, और पैटर्न नहीं बदला है। पाइप किए गए भाव काफी सहज हो सकते हैं, यही वजह है कि वे अपील कर रहे हैं।
एरेन कैम्ब्र

मैं इस सबसेट पर एक और कमांड कैसे निष्पादित करूं? उदाहरण के लिए, मैं पंक्ति की गणना करना चाहता हूं: "df1%>% rowMeans (चयन (ए, बी, ई))" काम नहीं करता है।
बेन

आप एक पाइपलाइन को एक साथ श्रृंखला देंगे जैसे df1 %>% select(A, B, E) %>% rowMeans(.):। %>%टाइप करके पाइप के लिए प्रलेखन देखें?magrittr::`%>%`
सैम फ़िरके

448

आप कॉलम नामों के वेक्टर का उपयोग करके सब्मिट कर सकते हैं। मैं उन लोगों पर दृढ़ता से इस दृष्टिकोण को पसंद करता हूं जो स्तंभ नामों का इलाज करते हैं जैसे कि वे ऑब्जेक्ट नाम (जैसे subset()) हैं, खासकर जब फ़ंक्शन, पैकेज या एप्लिकेशन में प्रोग्रामिंग।

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]

4
वह त्रुटि देता है object of type 'closure' is not subsettable
एरन कैम्ब्रिज

24
@ArenCambre: तब आपका data.frame वास्तव में नाम नहीं है dfdfआँकड़े पैकेज में भी एक कार्य है।
जोशुआ उलरिच


2
@ सीना: क्योंकि -"A"एक वाक्यविन्यास त्रुटि है। और ?Extractकहते हैं, " i, j, ...भी नकारात्मक पूर्णांक, जो यह दर्शाता तत्वों / स्लाइस चयन से बाहर जाने के लिए हो सकता है।"
जोशुआ उलरिच

7
इस सिंटैक्स के साथ एक समस्या है क्योंकि अगर हम केवल एक कॉलम R निकालते हैं, तो डेटाफ़्रेम के बजाय एक वेक्टर लौटाता है और यह अवांछित हो सकता है > df[,c("A")] [1] 1:। उपयोग subsetकरने से यह नुकसान नहीं होता है।
डेविड डोरचीस जुएल

100

यह subset()फ़ंक्शन की भूमिका है :

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4

जब मैं अपने डेटा के साथ यह कोशिश करता हूं, तो मुझे त्रुटि मिलती है: "एक्स में त्रुटि [जे]: अमान्य सबस्क्रिप्ट प्रकार 'सूची'" लेकिन अगर ग ("ए", "बी") एक सूची नहीं है, तो यह क्या है ?
राफेल_एस्पेरिकुटा 18

@Rafael_Espericueta आपके कोड को देखे बिना अनुमान लगाना कठिन है ... लेकिन c("A", "B")एक वेक्टर है, सूची नहीं।
स्टीफन लॉरेंट

यह डेटा फ़्रेम को सूची में परिवर्तित करता है।
सुत अतान पीएचडी

78

दो स्पष्ट विकल्प हैं: यहोशू उलरिच df[,c("A","B","E")]या

df[,c(1,2,5)]

जैसे की

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8

16

केवल किसी कारण के लिए

df[, (names(df) %in% c("A","B","E"))]

मेरे लिए काम किया। उपरोक्त सभी सिंटैक्स में "अपरिभाषित कॉलम चयनित" हैं।


15

जहां df1 आपका मूल डेटा फ़्रेम है:

df2 <- subset(df1, select = c(1, 2, 5))

7
यह उपयोग नहीं करता है dplyr। यह उपयोग करता है base::subset, और स्टीफन लॉरेंट के जवाब के समान है, सिवाय इसके कि आप कॉलम नामों के बजाय कॉलम नंबर का उपयोग करते हैं।
ग्रेगर थॉमस

14

आप उस sqldfपैकेज का भी उपयोग कर सकते हैं जो R डेटा फ़्रेम पर चयन करता है जैसे:

df1 <- sqldf("select A, B, E from df")

यह आउटपुट df1को कॉलम के साथ डेटा फ्रेम के रूप में देता है : ए, बी, ई।




0

[ और सबसेट प्रतिस्थापन योग्य नहीं हैं:

[ यदि कोई एक कॉलम चुना जाता है तो एक वेक्टर वापस करता है।

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)

4
अगर आप सेट करते हैं तो नहीं drop=FALSE। उदाहरण:df[,c("a"),drop=F]
तक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.