2012-10-22 18 views
17

यह एक आसान सवाल हो सकता है, लेकिन मैं अभी भी आरआर का उपयोग करते हुए बाहरी सूची के आधार पर डेटा.फ्रेम से पंक्तियों को कैसे हटाएं?

को उपयोग करने के लिए मदद की जरूरत मैं एक data.frame (main_data) है, का कहना है की सुविधा देता है ..

NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar 

मैं कुछ पंक्तियों को निकालना चाहते हैं नामों की सूची के आधार पर।

NAMES_list 
Jyo 
Ras 
Poo 

तो इस सूची के आधार पर, अगर नाम के किसी भी मेरे ऊपर "main_data" तालिका से मेल खाते हैं, तो मैं पूरी पंक्ति उन्हें contianing निकालना चाहते हैं: तो कहते हैं कि मैं इस प्रकार तालिका के किसी अन्य सूची है की सुविधा देता है , इसलिए परिणाम

NAMES AGE  LOC 
Abid 27  Kar 
Sus  28  Kar 

क्या कोई मेरी मदद कर सकता है कि आर का उपयोग करके इसे कैसे प्राप्त किया जाए? अग्रिम धन्यवाद .. :)

उत्तर

28

उपयोग %in%:

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ] 
+0

आपकी मदद के लिए धन्यवाद। मैं कोशिश करूँगा। – Letin

5

अपने डेटा प्रतिकृति

dat <- read.table(text=" 
NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar", 
stringsAsFactors=FALSE, header=TRUE) 

remove <- c("Jyo", "Ras", "Poo") 

सरल subsetting:

dat[!dat$NAMES %in% remove, ] 
    NAMES AGE LOC 
2 Abid 27 Kar 
5 Sus 28 Kar 

यहाँ हो रहा है डब्ल्यू यह काम करता है: पहली बार मैं इसे देखा निर्माण

!dat$NAMES %in% remove 
[1] FALSE TRUE FALSE FALSE TRUE 

मैं इस से हैरान किया जा रहा याद रखें: एक तार्किक वेक्टर इंगित करता है कि पंक्तियों रखने के लिए वापस जाने के लिए ! निषेध और %in% का एक संयोजन का उपयोग करें। ऐसा क्यों है कि !dat$NAMES कुछ भी उपयोगी है? खैर, निश्चित रूप से अंतर्दृष्टि यह है कि इन्फिक्स ऑपरेटर %in% पहले मूल्यांकन किया जाता है, इसलिए ! बस एक तार्किक नोट ऑपरेटर नहीं है।

+0

... और इसे पहले मूल्यांकन किया जाता है क्योंकि इसमें [प्राथमिकता] है (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Syntax.html) '%% से अधिक' । – January

10

हैं, संयोग से, आप वास्तव में एक data.table (के रूप में एक data.frame के खिलाफ), और अपने data.table एक key है, तो आपको मुहावरा

library(data.table) 
dat <- as.data.table(read.table(text=" 
NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar", 
stringsAsFactors=FALSE, header=TRUE)) 

setkey(dat, NAMES) 

to.remove <- c("Jyo","Ras","Poo") 
dat[-dat[to.remove, which=TRUE]] 
# NAMES AGE LOC 
#1: Abid 27 Kar 
#2: Sus 28 Kar 
बेशक

, में शामिल नहीं उपयोग कर सकते हैं अन्य twoanswersdata.table पर भी काम करेगा, लेकिन यह अधिक कुशल होना चाहिए।


संपादित

data.table संस्करण 1.8.3 के रूप में, "!" उपसर्ग का उपयोग "नॉन-जॉइन" के लिए किया जा सकता है (NEWS देखें)।

dat[!to.remove] 
    NAMES AGE LOC 
1: Abid 27 Kar 
2: Sus 28 Kar 
+2

+1 हमें वास्तव में काम करने में शामिल होने की उचित आवश्यकता नहीं है, हम नहीं: '[tto [to.remove] '। यह आंतरिक रूप से कार्यान्वित करने में वास्तव में काफी आसान है लेकिन मुझे अभी तक यह नहीं मिला है :(यह [FR # 1384] है (https://r-forge.r-project.org/tracker/index.php?func=detail&aid= 1384 और group_id = 240 और Atid = 978)। –

1

तुम भी उपयोग कर सकते हैं match का उपयोग यदि आपके main_data $ नाम

NAMES_list <- c("Jyo","Ras","Poo") 
main_data <- main_data[-match(NAMES_list,main_data$NAMES),] 
main_data 
    NAMES AGE LOC 
2 Abid 27 Kar 
5 Sus 28 Kar 

में अद्वितीय मान यह पंक्तियों को बिल्कुल main_data $ नाम के साथ अपने NAMES_list से मेल खाता निकाल देंगे।

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