将数据从一个数据帧追加到R(或stata)中的另一个数据帧上

问题描述 投票:0回答:2

我目前在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中提取天气数据,并使用为其日期命名的其他列(从第二个数据集中获取的数据)附加了该数据。

很显然,我是手动创建的第三个数据集,否则我将不会在这里询问代码。我需要弄清楚如何自动从前两个数据集中生成第三个数据集,以便可以对两个更大的数据集执行该过程。

任何帮助将不胜感激!

r dataframe merge append stata
2个回答
0
投票

首先,您需要重整形状。使用看起来像这样的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 )

0
投票

将您的天气数据转换为宽格式,并加入家庭数据。应该这样做:

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")
© www.soinside.com 2019 - 2024. All rights reserved.