首页 > 解决方案 > R统一具有部分冗余的数据

问题描述

我有这样的数据

     B        A      Distance
 1: 1101053 1102060      3.8
 2: 1101053 1102065      6.1
 3: 1101053 1102067      5.8
 4: 1101053 1102068      4.0
 5: 1101053 1102069      5.1
 6: 1101053 1102069      6.0
 7: 1101053 1102069      7.0
 8: 1101053 1102069      6.6
 9: 1101053 1102069      6.6
10: 1101053 1103051      4.3
11: 1101053 1103052      5.6

在第 5 行到第 9 行中,它们在 B、A 列中共享相同的值,但距离不同。如果我用一个距离(最小)将它们统一起来,最好的解决方案是什么?

预期的输出将是

     B        A      Distance
 1: 1101053 1102060      3.8
 2: 1101053 1102065      6.1
 3: 1101053 1102067      5.8
 4: 1101053 1102068      4.0
 5: 1101053 1102069      5.1
 6: 1101053 1103051      4.3
 7: 1101053 1103052      5.6

我会很感激一些帮助

标签: rdataframeduplicates

解决方案


您可以分组并取最小值:

dat <- read.table(header=TRUE, text="
     B        A      Distance
 1101053 1102060      3.8
 1101053 1102065      6.1
 1101053 1102067      5.8
 1101053 1102068      4.0
 1101053 1102069      5.1
 1101053 1102069      6.0
 1101053 1102069      7.0
 1101053 1102069      6.6
 1101053 1102069      6.6
 1101053 1103051      4.3
 1101053 1103052      5.6")

解决方案使用data.table

 library(data.table)
 setDT(dat)
 dat[, .(Distance = min(Distance)), by=.(B, A)]

#>          B       A Distance
#> 1: 1101053 1102060      3.8
#> 2: 1101053 1102065      6.1
#> 3: 1101053 1102067      5.8
#> 4: 1101053 1102068      4.0
#> 5: 1101053 1102069      5.1
#> 6: 1101053 1103051      4.3
#> 7: 1101053 1103052      5.6

使用以下解决方案tidyverse

 library(dplyr)
 dat %>% 
   group_by(B, A) %>%
   summarize(Distance = min(Distance))

#> # A tibble: 7 x 3
#> # Groups:   B [1]
#>         B       A Distance
#>     <int>   <int>    <dbl>
#> 1 1101053 1102060      3.8
#> 2 1101053 1102065      6.1
#> 3 1101053 1102067      5.8
#> 4 1101053 1102068      4  
#> 5 1101053 1102069      5.1
#> 6 1101053 1103051      4.3
#> 7 1101053 1103052      5.6

推荐阅读