如何根据包括列名在内的两个条件分配一个值。 (将环境变量添加到跟踪数据中)

How to assign a value depending on two conditions including column names. (add environmental variable to tracking data)

我有一个数据框(track),其中包含不同动物的跟踪点的位置(经度 - 纬度)和日期(一年中的天数)和另一个数据框(var),它给出了一年中每一天在不同地点的平均温度。

我想在我的数据框 (Track) 中添加一个新列 TEMP,其中的值将来自 (var),并对应于 (track) 中每个跟踪点的日期和 GPS 位置。

这是我的数据的一个非常简单的子集以及我想要获得的数据。

track = data.frame(
  animals=c(1,1,1,2,2),
  Longitude=c(117,116,117,117,116),
  Latitude=c(18,20,20,18,20),
  Day=c(1,3,4,1,5))


Var = data.frame(
  Longitude=c(117,117,116,116),
  Latitude=c(18,20,18,20),
  Day1=c(22,23,24,21),
  Day2=c(21,28,27,29),
  Day3=c(12,13,14,11),
  Day4=c(17,19,20,23),
  Day5=c(32,33,34,31)
  )

TrackPlusVar = data.frame(
  animals=c(1,1,1,2,2),
  Longitude=c(117,116,117,117,116),
  Latitude=c(18,20,20,18,20),
  Day=c(1,3,4,1,5),
  Temp= c(22,11,19,22,31)
    )

我不知道如何从相同的日期和 GPS 位置分配值,因为它是列名。任何想法都会非常有用!

这是 dplyrtidyr 的方法。

library(dplyr)
library(tidyr)

# reshape table Var
Var %>% 
  gather(Day,Temp,-Longitude, -Latitude) %>%
  mutate(Day = as.numeric(gsub("Day","",Day))) -> Var2

# join tables
track %>% left_join(Var2, by=c("Longitude", "Latitude", "Day"))

#   animals Longitude Latitude Day Temp
# 1       1       117       18   1   22
# 2       1       116       20   3   11
# 3       1       117       20   4   19
# 4       2       117       18   1   22
# 5       2       116       20   5   31

如果创建您的表的过程确保您的所有案例都属于这两个表,那么您可以使用 inner_join 而不是 left_join 来加快该过程。

如果您仍然对速度不满意,可以使用 data.table 加入过程来检查它是否更快,例如:

library(data.table)

Var2 = setDT(Var2, key = c("Longitude", "Latitude", "Day"))
track = setDT(track, key = c("Longitude", "Latitude", "Day"))

Var2[track][order(animals,Day)]

#    Longitude Latitude Day Temp animals
# 1:       117       18   1   22       1
# 2:       116       20   3   11       1
# 3:       117       20   4   19       1
# 4:       117       18   1   22       2
# 5:       116       20   5   31       2