如何根据包括列名在内的两个条件分配一个值。 (将环境变量添加到跟踪数据中)
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 位置分配值,因为它是列名。任何想法都会非常有用!
这是 dplyr
和 tidyr
的方法。
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
我有一个数据框(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 位置分配值,因为它是列名。任何想法都会非常有用!
这是 dplyr
和 tidyr
的方法。
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