Добавление данных из одного фрейма данных в другой фрейм данных в R (или stata) - PullRequest
0 голосов
/ 05 мая 2020

В настоящее время я работаю в 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

Как видите, каждое домохозяйство извлекало данные о погоде из своего идентификатора местоположения и добавляло их, используя дополнительные столбцы, которые названы по их дате (которая была взята из второго набора данных).

Очевидно, я создал этот третий набор данных вручную, иначе я бы не запрашивал здесь код. Мне нужно выяснить, как автоматизировать создание третьего набора данных из первых двух, чтобы я мог выполнить этот процесс на двух гораздо более крупных наборах данных.

Любая помощь будет очень признательна !!

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Преобразуйте ваши данные о погоде в широкий формат и присоединитесь к домашним данным. Это должно сработать:

library(tidyverse)

#set up the household dataset
household_data <-  tribble(~"house.id",~"location.id",
                           10001,"a",
                           10002,"b",
                           10003,"c",
                           10004,"c",
                           10005,"a")
#set up the weather dataset
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"), # converts to wide format
            by = "location.id") # joins the two data frames
# A tibble: 5 x 5
  house.id location.id `2020-01-01` `2020-01-02` `2020-01-03`
     <dbl> <chr>              <dbl>        <dbl>        <dbl>
1    10001 a                     70           61           57
2    10002 b                     71           63           50
3    10003 c                     74           61           64
4    10004 c                     74           61           64
5    10005 a                     70           61           57

Однако я не знаю, как это сделать в Stata!

0 голосов
/ 05 мая 2020

попробуйте сделать так

hh <- structure(list(house.id = 10001:10005, location.id = structure(c(1L, 
                                                                       2L, 3L, 3L, 1L), .Label = c("a", "b", "c"), class = "factor")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                           -5L))
temperature <- structure(list(date = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
                                                 3L, 3L), .Label = c("01.01.2020", "02.01.2020", "03.01.2020"), class = "factor"), 
                              location.id = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                        3L), .Label = c("a", "b", "c"), class = "factor"), temperature = c(70L, 
                                                                                                                           71L, 74L, 61L, 63L, 61L, 57L, 50L, 64L)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                         -9L))

library(tidyverse)
temperature %>% 
  left_join(hh) %>% 
  pivot_wider(c(house.id, location.id),
              names_from = date,
              values_from = temperature) %>% 
  arrange(house.id)
0 голосов
/ 05 мая 2020

Сначала вам нужно изменить форму пошире.

Используя data.table, который будет выглядеть так

library(data.table)
dd <- setDT(dd)
dd <- dcast(dd, location.id ~ date, value.var="temperature")

Или, используя базу R:

dd <- reshape(dd, direction = "wide", idvar = "location.id", timevar = "date")

Затем вы можете объединить:

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 )
...