【问题标题】:Removing rows using unique(data.table) or distinct (dplyr) and partial gsub使用 unique(data.table) 或 distinct (dplyr) 和部分 gsub 删除行
【发布时间】:2020-06-04 16:32:17
【问题描述】:

我有一个数据集,可以对它说 DT1。 DT1 有 2 列,City 和 Places。我将 DT1 与另一个数据集 (DT2) 匹配以填充缺失的 City 值。但是正如您所看到的,有些地方位于不同的城市,但名称相同。我想删除这些地方并将其余的地方与 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 中的 city 列。

这里是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 行,但唯一或不同的功能不允许我据我所知他们总是保留第一行。

这就是我想要实现的目标

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) 分开,但它也没有对这些人提出任何建议? p>

【问题讨论】:

    标签: r data.table unique distinct gsub


    【解决方案1】:

    data.table 的选项

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

    【讨论】:

      【解决方案2】:

      使用dplyr,您可以通过计算列places 中的所有出现次数来删除所有“苹果”:

      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
      

      【讨论】:

      • 回答您的问题。我还找到了另一种解决方法,以防人们需要它DT1[!(duplicated(DT1$places) | duplicated(DT1$places, fromLast = TRUE)), ] 仍然无法解决部分匹配问题。您对此有什么建议吗?
      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2023-02-26
      相关资源
      最近更新 更多