मैं डेटा फ़्रेम में पंक्तियों को कैसे हटाऊं?


224

मेरे पास "mydata" नाम का एक डेटा फ़्रेम है जो इस तरह दिखता है:

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

मैं पंक्ति 2,4,6 हटाना चाहता / चाहती हूं। उदाहरण के लिए, इस तरह:

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 

12
इसके अलावा, आप डेटा के साथ काम करने के लिए कुछ सामान्य शब्दावली से परिचित होना चाह सकते हैं। इसे आमतौर पर सबसेट के रूप में संदर्भित किया जाता है, जो कि, यदि आपने "आर सब्मिट डेटा फ्रेम" के लिए Google में खोजा है, तो आपको बहुत उपयोगी यूसीएलए आर एफएक्यू पृष्ठ मिलेगा । Stackoverflow में आपका स्वागत है, वैसे!
a5C1D2H2I1M1N2O1R2T1

@ Mrdwab के उत्कृष्ट उत्तर के अलावा, बूलियन वैक्टर का उपयोग करके उप-भाग के कुछ अतिरिक्त तरीके जोड़े गए।
१०:०४ पर पॉल हैमस्ट्रा

2
@ A5C1D2H2I1M1N2O1R2T1: R सब्मिटिंग के लिए UCLA FAQ स्थानांतरित हो गया है। अब यह यहाँ है
माइक शेरिल 'कैट रिकॉल'

जवाबों:


340

मुख्य विचार यह है कि आप उन पंक्तियों का एक समूह बनाते हैं जिन्हें आप हटाना चाहते हैं, और उस सेट के पूरक को बनाए रखें।

आर में, एक सेट का पूरक '-' ऑपरेटर द्वारा दिया जाता है।

तो, यह data.frameकहते हुए कि myData:

myData[-c(2, 4, 6), ]   # notice the -

myDataयदि आप उन पंक्तियों को पूरी तरह से छोड़ना चाहते हैं , तो निश्चित रूप से "पुनर्मूल्यांकन" को मत भूलना --- अन्यथा, आर परिणामों को प्रिंट करता है।

myData <- myData[-c(2, 4, 6), ]

59
,वहाँ नोट करने के लिए मत भूलना ! ;)
स्टीवन ज्यूरिस

5
क्या होगा यदि आपकी डेटाफ्रेम केवल एक कॉलम है। यह पूरी संरचना को
गिराता है

6
@road_to_quantdom, drop = FALSEवहां एक जोड़ें ।
A5C1D2H2I1M1N2O1R2T1

4
"आर में, एक सेट का पूरक '-' ऑपरेटर" द्वारा दिया गया है -> यह एक बहुत ही भ्रामक शब्द है। नकारात्मक सूचकांक हटा दिए जाते हैं और यही वह है, पूरक की कोई धारणा नहीं है। यदि आप तार्किक के साथ काम करते हैं और -इसका उपयोग करने का प्रयास करते हैं तो यह काम नहीं करेगा, क्योंकि तार्किकों के लिए पूरक ऑपरेटर है !। पंक्तियों में c (2,4,6) के पूरक के बजाय setdiff होगा (c (2,4,6), 1: nrow (myData)), जो c (-2, -4, -6) नहीं है , हालांकि दोनों एक ही पंक्तियों जब उपज के साथ प्रयोग किया जाएगा [
asac

2
@Speldosa, myData[-c(2, 4, 6),,drop=F]। वास्तव में, मेरा सुझाव है कि आप हमेशा किसी भी मैट्रिक्स एक्सेस ,drop=Fसे ठीक पहले डालें ]
हारून मैकडैड

82

आप एक तथाकथित बूलियन वेक्टर, उर्फ ​​के साथ भी काम कर सकते हैं logical:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

ध्यान दें कि !ऑपरेटर एक अर्थात के रूप में कार्य करता है !TRUE == FALSE:

myData = myData[!row_to_keep,]

@ Mrwab के उत्तर (+1 btw :)) की तुलना में यह थोड़ा बोझिल लगता है, लेकिन मक्खी पर एक तार्किक वेक्टर उत्पन्न किया जा सकता है, जैसे कि एक स्तंभ मान एक निश्चित मान से अधिक है:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

आप बूलियन वेक्टर को सूचकांकों के वेक्टर में बदल सकते हैं:

row_to_keep = which(myData$A > 4)

अंत में, एक बहुत ही साफ-सुथरी चाल यह है कि आप न केवल निष्कर्षण के लिए, बल्कि असाइनमेंट के लिए भी इस तरह का उपयोग कर सकते हैं:

myData$A[myData$A > 4,] <- NA

जहां कॉलम Aअसाइन किया गया है NA(संख्या नहीं) जहां A4 से अधिक है।


यदि आप उन्हें बाहर करना चाहते हैं तो क्या होगा? आपके उदाहरण संख्या 3 में, यदि आप
वेन करते हैं

61

पंक्ति संख्या द्वारा हटाने की समस्या

त्वरित और गंदे विश्लेषणों के लिए, आप शीर्ष उत्तर के अनुसार डेटा की पंक्तियों को संख्या के अनुसार हटा सकते हैं। अर्थात,

newdata <- myData[-c(2, 4, 6), ] 

हालांकि, यदि आप एक मजबूत डेटा विश्लेषण स्क्रिप्ट लिखने की कोशिश कर रहे हैं, तो आपको आम तौर पर संख्यात्मक स्थिति से पंक्तियों को हटाने से बचना चाहिए। ऐसा इसलिए है क्योंकि भविष्य में आपके डेटा में पंक्तियों का क्रम बदल सकता है। डेटा.फ्रेम या डेटाबेस तालिकाओं का एक सामान्य सिद्धांत यह है कि पंक्तियों का क्रम मायने नहीं रखना चाहिए। यदि ऑर्डर मायने रखता है, तो इसे डेटा.फ्रेम में एक वास्तविक चर में एन्कोड किया जाना चाहिए।

उदाहरण के लिए, कल्पना करें कि आपने डेटा का निरीक्षण करने और उन पंक्तियों की पंक्ति संख्याओं की पहचान करने के बाद संख्यात्मक स्थिति द्वारा एक डेटासेट और हटाए गए पंक्तियों को आयात किया था जिन्हें आप हटाना चाहते थे। हालाँकि, बाद में कुछ बिंदु पर, आप कच्चे डेटा में जाते हैं और चारों ओर एक नज़र डालते हैं और डेटा को पुन: व्यवस्थित करते हैं। आपका पंक्ति विलोपन कोड अब गलत पंक्तियों को हटा देगा, और इससे भी बदतर, आपको कोई चेतावनी मिलने की संभावना नहीं है कि यह आपको हो गया है।

बेहतर रणनीति

एक बेहतर रणनीति पंक्ति के मूल और स्थिर गुणों के आधार पर पंक्तियों को हटाना है। उदाहरण के लिए, यदि आपके पास एक idस्तंभ चर है जो विशिष्ट रूप से प्रत्येक मामले की पहचान करता है, तो आप इसका उपयोग कर सकते हैं।

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

दूसरी बार, आपके पास एक औपचारिक बहिष्करण मानदंड होगा जो निर्दिष्ट किया जा सकता है, और आप उस नियम के आधार पर मामलों को बाहर करने के लिए आर में कई सबसे अच्छा उपकरण का उपयोग कर सकते हैं।


11

अपने डेटा फ्रेम में आईडी कॉलम बनाएं या पंक्ति को पहचानने के लिए किसी भी कॉलम नाम का उपयोग करें। हटाने के लिए अनुक्रमणिका का उपयोग करना उचित नहीं है।

subsetनए फ्रेम बनाने के लिए फ़ंक्शन का उपयोग करें ।

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

9

सरलीकृत अनुक्रम द्वारा:

mydata[-(1:3 * 2), ]

क्रम से:

mydata[seq(1, nrow(mydata), by = 2) , ]

नकारात्मक अनुक्रम द्वारा:

mydata[-seq(2, nrow(mydata), by = 2) , ]

या यदि आप विषम संख्याओं का चयन करके कम करना चाहते हैं:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

या यदि आप विषम संख्या, संस्करण 2 का चयन करके कम करना चाहते हैं:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

या यदि आप संख्याओं को फ़िल्टर करके भी कम करना चाहते हैं:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

या यदि आप संख्याओं को फ़िल्टर करके भी कम करना चाहते हैं, तो संस्करण 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

5

Dan को कर्मचारी से हटा दें। डेटा - नया डेटा प्रबंधन करने की आवश्यकता नहीं है।

employee.data <- subset(employee.data, name!="Dan")

0

सूचकांक द्वारा एक पंक्ति को हटाने के लिए यहां एक त्वरित और गंदा कार्य है।

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

यह मुख्य दोष है यह row_index तर्क R मानों के वेक्टर होने के R पैटर्न का पालन नहीं करता है। अन्य समस्याएं भी हो सकती हैं क्योंकि मैंने केवल कुछ मिनट लिखने और परीक्षण करने में बिताए हैं, और केवल पिछले कुछ हफ्तों में आर का उपयोग करना शुरू कर दिया है। इस पर कोई टिप्पणी और सुधार बहुत स्वागत होगा!


0

पूर्णता के लिए, मैं यह जोड़ूंगा कि यह dplyrउपयोग करने के साथ किया जा सकता है slice। इसका उपयोग करने का लाभ यह है कि यह एक पाइप्ड वर्कफ़्लो का हिस्सा हो सकता है।

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

बेशक, आप इसे बिना पाइप के भी उपयोग कर सकते हैं।

df <- slice(df, -c(2, 4, 6))

"नहीं वेक्टर" प्रारूप, -c(2, 4, 6)साधन सब कुछ है कि है पाने के लिए नहीं एक सीमा का उपयोग कर पंक्तियों 2, 4 और 6 के एक उदाहरण के लिए पर, चलो आप पहले 5 पंक्तियों को दूर करना चाहता था कहते हैं, तुम कर सकते हो slice(df, 6:n())। अधिक उदाहरणों के लिए, डॉक्स देखें ।

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