我目前在R中工作,但如果有一些帮助,我也可以在stata中解决此问题。
我有两个非常大的数据集。一个包含住户及其位置,另一个包含按日期和位置排列的天气数据。我最终需要一个数据集,其中每一行都是一个家庭,并包含按位置与该家庭匹配的天气数据。在此数据集中,每列将标识该观察的日期。
为了简单起见,我在R中创建了三个数据帧的样本。
第一个模拟了我的家庭数据:
house.id location.id
1 10001 a
2 10002 b
3 10003 c
4 10004 c
5 10005 a
第二个模拟我的天气数据:
date location.id temperature
1 2020-01-01 a 70
2 2020-01-01 b 71
3 2020-01-01 c 74
4 2020-01-02 a 61
5 2020-01-02 b 63
6 2020-01-02 c 61
7 2020-01-03 a 57
8 2020-01-03 b 50
9 2020-01-03 c 64
最后一个显示我的最终目标是:
house.id location.id 2020-01-01 2020-01-02 2020-01-03
1 10001 a 70 62 57
2 10002 b 71 63 50
3 10003 c 74 61 64
4 10004 c 74 61 64
5 10005 a 70 62 57
您可以看到,每个家庭都从其位置ID中提取天气数据,并使用为其日期命名的其他列(从第二个数据集中获取的数据)附加了该数据。
很显然,我是手动创建的第三个数据集,否则我将不会在这里询问代码。我需要弄清楚如何自动从前两个数据集中生成第三个数据集,以便可以对两个更大的数据集执行该过程。
任何帮助将不胜感激!
首先,您需要重整形状。使用看起来像这样的data.table
library(data.table)
dd <- setDT(dd)
dd <- dcast(dd, location.id ~ date, value.var="temperature")
然后您可以合并:
m <- merge(d, dd, by="location.id", all.x = T)
location.id house.id 2020-01-01 2020-01-02 2020-01-03
1 a 10001 70 61 57
2 a 10005 70 61 57
3 b 10002 71 63 50
4 c 10003 74 61 64
5 c 10004 74 61 64
数据:
d <- read.table(text = " house.id location.id
1 10001 a
2 10002 b
3 10003 c
4 10004 c
5 10005 a
",header=T)
dd <- read.table(text = " date location.id temperature
1 2020-01-01 a 70
2 2020-01-01 b 71
3 2020-01-01 c 74
4 2020-01-02 a 61
5 2020-01-02 b 63
6 2020-01-02 c 61
7 2020-01-03 a 57
8 2020-01-03 b 50
9 2020-01-03 c 64
",header=T )
将您的天气数据转换为宽格式,并加入家庭数据。应该这样做:
library(tidyverse)
household_data <- tribble(~"house.id",~"location.id",
10001,"a",
10002,"b",
10003,"c",
10004,"c",
10005,"a")
weather_data <- tribble(~"date", ~"location.id", ~"temperature",
"2020-01-01","a",70,
"2020-01-01","b",71,
"2020-01-01","c",74,
"2020-01-02","a",61,
"2020-01-02","b",63,
"2020-01-02","c",61,
"2020-01-03","a",57,
"2020-01-03","b",50,
"2020-01-03","c",64)
household_data %>%
full_join(weather_data %>%
pivot_wider(names_from = "date",
values_from = "temperature"),
by = "location.id")