使用%in%过滤行?

时间:2017-09-14 20:56:17

标签: r

我有一个数据框data,包含:

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匹配的所有行以及数据中的相同街道名称。因此data$Name中的'Anderson'和data$Street中的'Some'会删除该行。请注意两个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"

由于

2 个答案:

答案 0 :(得分:3)

你能测试一下这项工作吗?

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`)

结果使用@ycw dataset

          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中的条目进行过滤。

答案 1 :(得分: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 = "|")创建一个正则表达式模式,用OR测试元素。 ignore.case = TRUE使匹配忽略了案例中的差异。 &表示需要满足两个grepl条件。 !表示相反的情况。

数据

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)