2017-06-15 97 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哦,没错!我会添加它。谢谢。 –