【问题标题】:subset a datatable using multiple criteria from second table使用第二个表中的多个条件对数据表进行子集化
【发布时间】:2021-05-25 07:46:48
【问题描述】:

我有一个非常大的海洋站点数据表和每个站点的多个深度(表 1)。 我需要在另一个数据表(表 2)中提取与站点位置和深度匹配的行。

表 1 - 要作为子集的表

Lat Long Depth Nitrate
165 -77 0 29.5420
165 -77 50 30.2213
165 -77 100 29.2275
124 -46 0 27.8544
124 -46 50 28.6458
124 -46 100 24.9543
76 -24 0 31.9784
76 -24 50 28.6408
76 -24 100 24.9746
25 -62 0 31.9784
25 -62 50 28.6408
25 -62 100 24.9746

表 2 - 子集所需的坐标和深度:

Lat Long Depth
165 -77 100
76 -24 50
25 -62 0

我已尝试将所有站点放在一个包含这些站点的所有可用深度数据的表中:

subset <- filter(table1, Lat == table2$Lat | Long == table2$Long)

但它返回零 obs。

有什么建议吗?

【问题讨论】:

    标签: r datatable subset


    【解决方案1】:

    您似乎正在寻找内部连接:

    merge(dat1, dat2, by = c("Lat", "Long"))
    #   Lat Long Depth.x Nitrate Depth.y
    # 1 165  -77     100 29.2275     100
    # 2 165  -77       0 29.5420     100
    # 3 165  -77      50 30.2213     100
    # 4  25  -62       0 31.9784       0
    # 5  25  -62      50 28.6408       0
    # 6  25  -62     100 24.9746       0
    # 7  76  -24       0 31.9784      50
    # 8  76  -24      50 28.6408      50
    # 9  76  -24     100 24.9746      50
    

    这有一些风险:在比较列时,连接等依赖于严格相等,但浮点(具有许多位精度)对于大多数编程语言来说可能变得太“精细”而无法检测差异(参见 @987654321 @、Is floating point math broken?https://en.wikipedia.org/wiki/IEEE_754)。这个问题的问题是你不会得到任何错误,它只是不会产生匹配。

    要解决那个问题,您需要考虑“公差”,即dat1 中的点与dat2 中的点之间的距离,以及所有点之间的距离是多少有效地“足够接近”以构成连接。这可以通过以下两种方式之一完成:(1)计算dat1 中所有点与dat2 中所有点之间的距离,并为dat1 中的每个点取最小值(并且在公差范围内);或 (2) 执行“模糊连接”(使用恰当命名的 fuzzyjoin 包)以查找范围内的点(实际上类似于 dat1$Lat between dat2$Lat +/- 0.01Long 的类似点)。


    数据

    dat1 <- structure(list(Lat = c(165L, 165L, 165L, 124L, 124L, 124L, 76L, 76L, 76L, 25L, 25L, 25L), Long = c(-77L, -77L, -77L, -46L, -46L, -46L, -24L, -24L, -24L, -62L, -62L, -62L), Depth = c(0L, 50L, 100L, 0L, 50L, 100L, 0L, 50L, 100L, 0L, 50L, 100L), Nitrate = c(29.542, 30.2213, 29.2275, 27.8544, 28.6458, 24.9543, 31.9784, 28.6408, 24.9746, 31.9784, 28.6408, 24.9746)), class = "data.frame", row.names = c(NA, -12L))
    dat2 <- structure(list(Lat = c(165L, 76L, 25L), Long = c(-77L, -24L, -62L), Depth = c(100L, 50L, 0L)), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • 表 1 是一个非常大的文件 - 1,917,030 obs。表 2 是 228 obs。
    • 你认为这个事实对这个答案有什么影响?
    【解决方案2】:

    pasteLatLong 列在一起的两个表并选择匹配的行。

    result <- subset(table1, paste(Lat, Long) %in% paste(table2$Lat, table2$Long))
    result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2015-04-24
      • 2021-02-16
      • 2018-03-08
      相关资源
      最近更新 更多