我有一个数据框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"
由于
答案 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%
。
以下是使用grepl
和dplyr
包的示例。
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)