【问题标题】:Is there a way to extract data from a df if an index value is close to an index in another df?如果索引值接近另一个 df 中的索引,有没有办法从 df 中提取数据?
【发布时间】:2020-04-03 11:58:34
【问题描述】:

所以我有两个数据框,df1 包含几千个 GPS 索引和天气数据,df2 包含动物的目击及其 GPS 索引(df1 比 df2 长)。

示例(df1 = 变量,df2 = 目击事件):

variables <- data.frame(gpsindex=c(100, 200, 300, 400, 500, 600), weather=c(3, 2, 1, 5, 4, 3))
sightings <- data.frame(gpsindex=c(199, 310, 324, 510), speciesindex=c(1, 2, 3, 4))

> variables
  gpsindex weather
1      100       3
2      200       2
3      300       1
4      400       5
5      500       4
6      600       3

> sightings
  gpsindex speciesindex
1      199            1
2      310            2
3      324            3
4      510            4

我的目标是使用sightings 中的gpsindexvariables 中提取适当的weather 值,然后将其添加回sightings 数据框。

  gpsindex speciesindex weather
1      199            1       3
2      310            2       1
3      324            3       1
4      510            4       4

像这样。但是,要提取正确的weather 值,gpsindex 需要位于第 1&2、2&3 行等之间。多个目击事件也可能在同一个gpsindex 区间内。

我已经通过 StackOverflow 搜索了大约一周,但我找不到任何讨论此技术的线程。或者(更有可能)我正在寻找错误的东西/使用错误的词汇。

有人有什么建议吗?

【问题讨论】:

  • 变量中的gpsindex是否总是100的倍数?
  • 没有。它大约有 330 000 个 GPS 点,在 df 中随机变化

标签: r dataframe indexing


【解决方案1】:

如果你的变量data.frame是按照gpsindex排序的,你可以这样做:

idx = findInterval(sightings$gpsindex,variables$gpsindex)

data.frame(sightings,weather=variables$weather[idx])
  gpsindex speciesindex weather
1      199            1       3
2      310            2       1
3      324            3       1
4      510            4       4

findInterval() 函数查找元素在向量中的位置,因此在这种情况下,它会准确返回您需要的行。

【讨论】:

    【解决方案2】:

    使用data.table,您可以进行快速滚动连接。如果您使用roll = TRUE,那么您将在gpsindex 中滚动当前值(类似于“最后一次观察结转”)。存在其他替代选项(有关详细信息,请参阅?data.table)。

    library(data.table)
    
    setDT(sightings)
    setDT(variables)
    
    variables[sightings, on = .(gpsindex), roll = T]
    

    输出

       gpsindex weather speciesindex
    1:      199       3            1
    2:      310       1            2
    3:      324       1            3
    4:      510       4            4
    

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 1970-01-01
      • 2018-04-04
      • 2020-10-31
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多