通过多列的值组合数据集

时间:2017-06-15 16:10:45

标签: r

我正在尝试根据两个数据集中多列的值输入值。 我有我的主数据集(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,但还没有想出任何东西。

2 个答案:

答案 0 :(得分:2)

你需要的是什么?

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 :(得分:1)

以下是使用dplyrtidyr执行此操作的方法。

基本上,您希望使用gatherDateXTemp列从df2融合为两列。然后,您希望使用gsub删除“Date”和“Temp”字符串,以获得与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