2017-06-15 96 views
2

我試圖根據來自兩個數據集的多列值輸入值。 我有我的主要數據集(df1),其中包含位置和相應日期的列表,df2包含每個可能日期所有位置的溫度列表。例如:按多列數值組合數據集

DF1

Location Date 
A   2 
B   1 
C   1 
D   3 
B   3 

DF2

Location Date1Temp Date2Temp Date3Temp 
A   -5   -4   0 
B   2   0   2 
C   4   4   5 
D   6   3   4 

我想創建在DF1的溫度變量,根據每個觀測的位置和日期。最好我想用同一個數據幀中的所有溫度數據執行此操作,但如果需要,可以將它們分開並按'日期'添加。隨着數據。例如,我想這是這樣創造的東西:

Location Date Temp 
A   2  -4 
B   1  2 
C   1  4 
D   3  4 
B   3  2 

我一直在合併和ifelse玩耍,但還沒有想出什麼出來呢。

+1

歡迎。你的'df2'列名是否與'df1'日期行完全匹配?例如,'Date1Temp'和'1'應該是相同的字符串還是日期對象?如果是這樣,您可以使用'melt'或'gather'將df2從寬數據幀轉換爲長整型數據幀,然後加入兩個數據幀。 – ssp3nc3r

回答

1

是您需要的嗎?

library(reshape2) 
library(magrittr) 
df1 <- data.frame(Location= c("A","B","C","D","B"),Date=c(2,1,1,3,3)) 
df2 <- data.frame(Location= c("A","B","C","D"),d1t=c(-5,5,4,6),d2t=c(-4,0,4,3),d3t=c(0,2,5,4)) 


merge(df1,df2) %>% melt(id.vars=c("Location","Date")) 
1

這裏是如何做到這一點與dplyrtidyr

基本上,你要使用gatherdf2DateXTemp列融化成兩列。然後,您要使用gsub刪除「日期」和「溫度」字符串以獲取與您在df1中所具有的數據相當的數字。由於DateXTemp最初是字符,因此您需要將其餘數字轉換爲數字as.numeric。然後我使用left_join來加入表格。

library(dplyr);library(tidyr) 
df1 <- data.frame(Location= c("A","B","C","D","B"),Date=c(2,1,1,3,3)) 
df2 <- data.frame(Location= c("A","B","C","D"),Date1Temp=c(-5,5,4,6), 
        Date2Temp=c(-4,0,4,3),Date3Temp=c(0,2,5,4)) 

df2_new <- df2%>% 
      gather(Date,Temp,Date1Temp:Date3Temp)%>% 
      mutate(Date=gsub("Date|Temp","",Date))%>% 
      mutate(Date=as.numeric(Date)) 
df1%>%left_join(df2_new) 

Joining, by = c("Location", "Date") 
    Location Date Temp 
1  A 2 -4 
2  B 1 5 
3  C 1 4 
4  D 3 4 
5  B 3 2 

編輯

至於建議的@Sotos,你可以做一個管道,像這樣:

df2%>% 
    gather(Date,Temp,Date1Temp:Date3Temp)%>% 
    mutate(Date=gsub("Date|Temp","",Date))%>% 
    mutate(Date=as.numeric(Date))%>% 
    left_join(df1,.) 

Joining, by = c("Location", "Date") 
    Location Date Temp 
1  A 2 -4 
2  B 1 5 
3  C 1 4 
4  D 3 4 
5  B 3 2 
+0

你可以在管道中保留'left_join'('...%>%left_join(df1,.'') – Sotos

+1

@Sotos哦,沒錯!我會添加它。謝謝。 –