【问题标题】:R distinct() does not take out duplicatesR distinct() 不取出重复项
【发布时间】:2020-05-01 14:12:05
【问题描述】:

我已经为此奋斗了一段时间。作为大型 for 循环的一部分,想要取出一些数据点以便能够在结果点周围创建凹壳(至少需要 4 个点)。为此,我有一条线确保删除 x 或 y 值全部相同的集群,以及少于 4 行的集群。但是,也可能发生集群中的某些点(不是全部)重复,导致集群有 >=4 行,但实际点不 >=4。为了取出这些重复项,我使用 distinct(),但有时这无法取出重复项,如下面的示例数据框所示。知道如何有效地取出这些重复项吗?

示例数据

SP_occ <- structure(list(x = c(-28.212197, -130.758, -15, 47.549999, -29.346937, 
-27.794644, -124.8, 47.416698, 47.75, -15.566667, 178.73, -29.344852, 
175.432999, 47.75, 87, -10, 55.666668, 46.533, 47, 114.75, -29.356563, 
87, 46, -128.296, -9, 154.21667, 47.549999, 47.549999, 87, -72.133301, 
-157.89167, -23.055, 87, 46.366665, 55.45, 122.932999, -28.991, 
153.216995, -29.35066, -29.122, 47.75, 123.967003, 121.5, 27.4167, 
-27.96666, 47.266701, 87, 87, 47.583302, 114.75, -26.610647, 
-26.589459, -10, 87, 122.949997, 47.583302, 125.400002, -15.533334, 
-25.239904, 45.533, -28.295, 47.416698, 46, 52.0833, 87, 172.932999, 
47.75, 5.4629, 121.667, 27.4167, -29.344852, -29.346937, -29.356563, 
-9.387, -28.212197, -27.794644, 154.216667, -28.991, -28.991, 
-29.35066, -25.239904, -26.610647, -26.589459, -27.96666, -15, 
87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 52.0833, 45.533, 
46.533, 114.75, -10, -15.533333, -15.566667, 178.73, -9.5, -9.466667, 
-9.466667, -9.466667, -9.466667, -9.466667, -9.466667, -8.916667, 
-8.916667, -9.083333, 152.756836, 138.74492, -9.321667, 5.4629, 
139.416667, 55.666668), y = c(38.659904, -23.931, 55, -38.366699, 
38.681605, 39.000465, -24.68, -38.349998, -38.650002, 28.183332, 
-38.65, 38.68313, -28.1833, -38.650002, -27, 46, -4.582778, -39.033, 
-9, -35, 38.671144, -27, -12, -24.328, 56, -20.85, -38.366699, 
-38.9333, -27, 40.966702, 21.391684, 16.5667, -27, -9.416667, 
-4.766666, 24.5, 42.497, -20.85, 37.997214, 42.432, -38.583302, 
24.0667, -11, -33.3167, 38.962846, -38.950001, -27, -27, -38.966702, 
-35, 40.341647, 40.357008, 46, -27, 24.299999, -38.966702, 24.5833, 
28.266666, 37.900563, -40.416, 29.891666, -38.349998, -9, -36.5833, 
-27, -28.5667, -38.583302, -26.1297, -11, -33.3167, 38.68313, 
38.681605, 38.671144, 57.245, 38.659904, 39.000465, -20.85, 42.497, 
42.497, 37.997214, 37.900563, 40.341647, 40.357008, 38.962846, 
55, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -36.5833, 
-40.416, -39.033, -35, 46, 28.266667, 28.183333, -38.65, 55.733333, 
55.666667, 55.666667, 55.666667, 55.666667, 55.666667, 55.666667, 
58.583333, 58.583333, 56.691667, -33.054223, 34.908889, 38.285, 
-26.1297, 35.25, -4.582778), cluster = c(1L, 2L, 3L, 4L, 5L, 
1L, 6L, 4L, 4L, 7L, 8L, 5L, 9L, 4L, 10L, 11L, 12L, 13L, 14L, 
15L, 5L, 10L, 16L, 17L, 18L, 19L, 4L, 4L, 10L, 20L, 21L, 22L, 
10L, 23L, 12L, 24L, 25L, 26L, 27L, 25L, 4L, 28L, 29L, 30L, 1L, 
4L, 10L, 10L, 4L, 15L, 31L, 31L, 11L, 10L, 24L, 4L, 32L, 7L, 
33L, 34L, 35L, 4L, 36L, 37L, 10L, 38L, 4L, 39L, 29L, 30L, 5L, 
5L, 5L, 40L, 1L, 1L, 19L, 25L, 25L, 27L, 33L, 31L, 31L, 1L, 3L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 37L, 34L, 
13L, 15L, 11L, 7L, 7L, 8L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 
42L, 42L, 43L, 44L, 45L, 46L, 39L, 47L, 12L)), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 
55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 
84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 
97L, 98L, 99L, 100L, 101L, 103L, 105L, 106L, 107L, 108L, 109L, 
111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 119L, 120L, 123L, 
125L, 126L, 135L, 136L, 141L), class = "data.frame")

代码

SP_occ  <- SP_occ %>% distinct()
SP_occ  <- SP_occ %>% group_by(cluster) %>% filter(!(n_distinct(round(x, 6)) == 1 || n_distinct(round(y, 6)) == 1) && n() >= 4)
SP_occ  <- SP_occ[SP_occ$cluster != 0,]
SP_occ$Cluster <- SP_occ %>% group_indices(cluster)
SP_occ         <- SP_occ[, c(1,2,4)]

【问题讨论】:

  • 生成一个id向量,例如,类似''dataset$id

标签: r dataframe dplyr data-manipulation


【解决方案1】:

您能否解释一下您的示例中的哪些记录是您所指的问题?使用 distinct() 后,您的数据中没有剩余的完全相同的重复项。如果您想删除“几乎”相同的记录(非常小的数字差异),您可以考虑这样做

SP_occ  <- SP_occ %>% 
  mutate(x = round(x,5),
         y = round(y,5)) %>% 
  distinct()

【讨论】:

  • 感谢您的提示。请参阅我从代码中获得的输出的附加答案。
  • 正如您在自己的输入中看到的(在此页面中搜索“-15.53333”),这些值实际上并不完全相同 - 一个是 -15.533333,另一个是 -15.533334。
  • 是的,我明白了,但是是什么导致它四舍五入到小数点后 5 位?
  • 这只是 R 的呈现方式。值本身实际上并没有四舍五入,但浮点数不会打印所有小数,因为它会使屏幕变得混乱。
  • 尝试设置选项(digits=10)
【解决方案2】:

我得到的结果是下面的 DF。聚类 2 由 4 个点组成,其中 2 个实际上是唯一的。

    x           y           Cluster
1   47.55000    -38.36670   1
2   47.41670    -38.35000   1
3   47.75000    -38.65000   1
4   -15.56667   28.18333    2
5   47.55000    -38.93330   1
6   47.75000    -38.58330   1
7   47.26670    -38.95000   1
8   47.58330    -38.96670   1
9   -15.53333   28.26667    2
10  -15.53333   28.26667    2
11  -15.56667   28.18333    2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2011-02-04
    • 2021-09-18
    相关资源
    最近更新 更多