因此,我有两个数据框,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上搜索了大约一个星期,但找不到任何讨论此技术的线程。或者(更有可能)我正在搜索错误的内容/使用了错误的词汇。
有人有什么建议吗?
答案 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