我正在尝试根据两个数据集中多列的值输入值。 我有我的主数据集(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,但还没有想出任何东西。
答案 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)
以下是使用dplyr
和tidyr
执行此操作的方法。
基本上,您希望使用gather
将DateXTemp
列从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