使用 unique(data.table) 或 distinct (dplyr) 和部分 gsub 删除行

Removing rows using unique(data.table) or distinct (dplyr) and partial gsub

我有一个数据集,可以说是 DT1。 DT1 有 2 列,城市和地点。我会将 DT1 与另一个数据集 (DT2) 匹配以填充缺失的城市值。但是正如您所看到的,有些地方位于不同的城市,但名称相同。我想删除这些地方并将其余地方与 DT2 匹配。这是我的 DT1。

DT1 <- data.table::data.table(city = c("XXX", "XXX", "YYY","ZZZ"),
 places= c("apple","orange","apple","pineapple"))

#> City     BirthPlace
#> XXX      apple
#> XXX      orange
#> YYY      apple
#> ZZZ      pineapple

当我使用 unique 或 distinct 时,它会保留 1 个苹果,这会导致 DT2 出现问题,因为即使我的 apple 位置属于 YYY,它也会将 XXX 粘贴到城市列中DT2.

这里是 DT2 的例子

DT2 <- data.table::data.table(zipcode = c("00001","00002","00003","00004"),
                  birthplace= c("apple","orange","pineapple","grapes")

#> ZipCode  BirthPlace
#> 00001      apple
#> 00002      orange
#> 00003      pineapple
#> 00004      grapes

如您所见,我在 DT2 中有一个 apple 位置。我不知道它的位置,是在 XXX 市还是在 YYY。这就是为什么我需要删除 DT1 中的所有 apple 行,但据我所知,unique 或 distincts 函数不允许我始终保留第一行。

这就是我想要实现的目标

DT3 <- data.table::data.table(city = c("XXX","ZZZ"),
                  birthplace= c("orange","grapes"),
                  zipcode = c("00002","00004")
#>  City BirthPlace ZipCode
#>   XXX    orange  00002
#>   ZZZ    grapes  00004

除此之外,一些出生地值包括标点符号,例如 apple st. 我试图将其拆分并让 apple 与 gsub("^(st.)*$","",dt2$birthplace) 分开,但它也没有任何作用对这些人有什么建议吗?

使用 dplyr 您可以通过计算列 places:

中出现的所有次数来删除所有 "apples"
DT1 %>%
  group_by(places) %>%
  filter(n() == 1)

这给了你

# A tibble: 2 x 2
# Groups:   places [2]
  city  places   
  <chr> <chr>    
1 XXX   orange   
2 ZZZ   pineapple

合并两者 Data.Tables

merge(DT1, DT2, by.x="places", by.y="birthplace")

产量

     places city zipcode
1    orange  XXX   00002
2 pineapple  ZZZ   00003

选项data.table

library(data.table)
DT1[, if(.N == 1) .SD, places][DT2, on = .(places = birthplace), nomatch = 0]