如果索引值接近另一个df中的索引,是否可以从df中提取数据?

时间:2020-04-03 11:58:34

标签: r dataframe indexing

因此,我有两个数据框,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

我的目标是使用gpsindex中的sightings来提取weather中适当的variables值,然后将其重新添加到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上搜索了大约一个星期,但找不到任何讨论此技术的线程。或者(更有可能)我正在搜索错误的内容/使用了错误的词汇。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您的变量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()函数可查找元素沿矢量所在的位置,因此,在这种情况下,它将精确返回所需的行。

答案 1 :(得分:1)

使用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