2017-09-14 40 views
0

我有一個數據幀,data,包括:使用%in%過濾行?

Name   House Street Apt City Postal Phone 
BARRY GORDON 106 SOME DR  A PLACE Z4K4N2 999-828-7555 
ANDERSON TAM 110 SOME DR  A PLACE Z4K4N2 999-542-7555 
BUCKLE J L S 117 SOME DR  A PLACE Z4K4N2 999-212-7555 

我還有一個數據幀,dnc,從read_excel閱讀:

Last Name Address # Street Name 
Anderson     Some Dr 
Cibrian  PO   Box 
Pistell  PO   Box 

我要排除所有匹配的行dnc[,1]data$Street AND數據中的相同街道名稱。所以'安德森'在data$Name和'一些'在data$Street將刪除該行。注意兩個dfs中資本的差異。我嘗試手動/硬編碼測試,仍然無法得到我想要的。我一直在努力:

library(dplyr) 
filter(data, dnc[,1] %in% data$Name & dnc[,3] %in% data$Street) 

avector <- as.vector(dnc[,1]) 
data[data$Name %in% avector, ] 

typeof(data$Name) 
[1] "character" 

感謝

+0

這是一般不好的做法由他們的人數是指列 - 從長遠來看,該列可能遊移,導致可能難以發現問題。如果您使用列名稱,代碼也會更容易。 – MichaelChirico

回答

3

您可以測試,如果這項工作:使用@ycw dataset

library(dplyr) 

# Modify entries 
data$NameMod <- tolower(gsub(" .*", "", data$Name)) 
data$StrMod <- tolower(data$Street) 
dnc$`Last Name` <- tolower(dnc$`Last Name`) 
dnc$`Street Name` <- tolower(dnc$`Street Name`) 

# Filter data using dplyr 
filter(data, !NameMod %in% dnc$`Last Name` & 
      StrMod %in% dnc$`Street Name`) 

結果:

  Name House Street Apt City Postal  Phone NameMod StrMod 
1 BARRY GORDON 106 SOME DR A PLACE Z4K4N2 999-828-7555 barry some dr 
2 BUCKLE J L S 117 SOME DR A PLACE Z4K4N2 999-212-7555 buckle some dr 

我不能使用您提供的數據,所以不得不盲目地編寫它。首先,您必須修改數據(例如,刪除Anderson之後的文本,並將所有內容都變爲小寫),然後按dnc中的條目進行過濾。

+0

gsub(「。*」,data $ Name):參數「x」缺失,沒有默認值。林不太清楚你想要什麼或ID修復它 – user136508

+0

@ sn0mmis修復。 – PoGibas

+1

@PoGibas您可以使用我的代碼來加載數據並測試您的代碼。我認爲「過濾(數據,!(NameMod%在%dnc $'Last Name&StrMod%in%dnc $ Address))」是正確的。 – www

2

我認爲你需要正則表達式來找到匹配的字符串,而不是%in%

以下是使用grepldplyr包的示例。

library(dplyr) 

data %>% 
    filter(!(grepl(paste0(unique(dnc$`Last Name`), collapse = "|"), Name, ignore.case = TRUE) & 
      grepl(paste0(unique(dnc$Address), collapse = "|"), Street, ignore.case = TRUE))) 
      Name House Street Apt City Postal  Phone 
1 BARRY GORDON 106 SOME DR A PLACE Z4K4N2 999-828-7555 
2 BUCKLE J L S 117 SOME DR A PLACE Z4K4N2 999-212-7555 

paste0(..., collapse = "|")創建一個正則表達式模式測試元件與ORignore.case = TRUE使匹配忽略情況的差異。 &表示兩個grepl條件需要都滿足。 !表示相反的情況。

DATA

library(dplyr) 

data <- read.table(text = "Name   House Street Apt City Postal Phone 
'BARRY GORDON' 106 'SOME DR'  A PLACE Z4K4N2 999-828-7555 
        'ANDERSON TAM' 110 'SOME DR'  A PLACE Z4K4N2 999-542-7555 
        'BUCKLE J L S' 117 'SOME DR'  A PLACE Z4K4N2 999-212-7555", 
        header = TRUE, stringsAsFactors = FALSE) 

dnc <- read.table(text = "'Last Name' Address 
Anderson     'Some Dr' 
Cibrian  'PO   Box' 
Pistell  'PO   Box'", 
        header = TRUE, stringsAsFactors = FALSE) 

dnc <- dnc %>% rename(`Last Name` = Last.Name) 
+0

它似乎取出了太多的行,當我檢查excel – user136508

+0

它適用於您提供的示例。因此,您的真實世界數據必須與您提供的示例不同。 – www

+0

是的,試圖找出現在。感謝您的迴應ycw。 – user136508