0

我有一個數據框(軌道)與不同的動物跟蹤點的位置(經度 - 緯度)和日期(一年中的一天的數量)和其他數據幀(var ),它給出了不同地點一年中每一天的平均溫度。如何根據兩個條件(包括列名稱)分配值。 (添加環境變量跟蹤數據)

我想添加一個新的列TEMP到我的數據框(Track),其中的值將來自(var)並且對應於(軌道)中每個跟蹤點的日期和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位置分配值,因爲它是一個列名。任何想法都會非常有用!

回答

1

這是一個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 
+0

非常感謝你,它的工作完美! – Jeff972

+0

data.table的用途/ adv。不僅是它的速度。在「緩慢」的情況下,它不一定只是一種替代品。而且你正在複製'Var2'和'track'。 – Arun

+1

你是對的(x2)@阿倫。我只是以這種方式呈現它,只是因爲我用'dplyr'開始創建'Var2'。也將更新以使用'setDT'創建data.tables。 – AntoniosK

相關問題