Как расширить с помощью нескольких переменных или измерений - PullRequest
1 голос
/ 07 мая 2019

Я хочу расширить три измерения в R. Я хочу объединить информацию об уровне округа на ежедневном уровне из трех лет во фрейме данных, который содержит все округа за все годы, включая все месяцы со всеми днями (например, 31).Проблема состоит в том, что не каждое наблюдение # дня округа доступно в данных об использовании.Это потому, что эти события не произошли в определенные даты в определенных графствах.Таким образом, для меня это нулевые наблюдения.

Чтобы создать мастер-файл, я беру список всех округов.Затем я хочу расширить его таким образом, чтобы у меня было уникальное наблюдение для каждой комбинации округа # год # месяц # день.

Я избавляю вас от кода.У меня есть data.frame, включая округа.Я бы сгенерировал годы, месяцы и дни.Я использовал расширение от Tidyverse до сих пор.

РЕДАКТИРОВАТЬ:

library(tidyverse)

# This is my list of all counties from an official source
counties <- data.frame("county" = c("A", "B" ,"c"))

# This is what I have, the data includes counties (not all),
# for year (not all),
# months (not all)
# and days (not all)

using <- data.frame("county"  = c("A", "A", "A", "B", "B", "B", "B"),
                    "year"  = c(2015,2016,2017,2015,2016,2017,2018),
                    "month" = c(1,2,7,2,3,2,4),
                    "day" = c(1,2,22,3,21,14,5))

# This is my attempt to get at least all county year combinations
county.month <- expand(counties, county, 1:12)

# But I wish I could get all county#year#month#dya combinations

Лучший

Даниэль

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Этот подход должен делать то, что вы хотите: Tibble со всеми возможными комбинациями округ / год / месяц / день (при условии, что каждый месяц имеет 31 день ...;)) Ключ должен работать с факторами

library(tidyverse)
counties <- data.frame("county" = c("A", "B" ,"C"), stringsAsFactors = F)
using <- tibble("county"  = c("A", "A", "A", "B", "B", "B", "B"),
                    "year"  = c(2015,2016,2017,2015,2016,2017,2018),
                    "month" = c(1,2,7,2,3,2,4),
                    "day" = c(1,2,22,3,21,14,5))

using %>% 
  mutate_if(is.character, as_factor) %>%
  mutate_if(is.numeric, as.ordered) %>%
  mutate(county = fct_expand(county, counties$county),
         month = fct_expand(month, as.character(1:12)),
         day = fct_expand(day, as.character(1:31))) %>%
  expand(county, year, month, day) %>%
  arrange(year, month, day)

# A tibble: 4,464 x 4
   county year  month day  
   <fct>  <ord> <ord> <ord>
 1 A      2015  1     1    
 2 B      2015  1     1    
 3 c      2015  1     1    
 4 A      2015  1     2    
 5 B      2015  1     2    
 6 c      2015  1     2    
 7 A      2015  1     3    
 8 B      2015  1     3    
 9 c      2015  1     3    
10 A      2015  1     5    
# … with 4,454 more rows
0 голосов
/ 07 мая 2019

Возможно, вы хотите, чтобы ВСЕ даты соответствовали годам в ваших данных. Если это так, используйте функцию seq() by="1 day".

library(tidyverse)
library(lubridate)
counties <- data.frame("county" = c("A", "B" ,"c"), stringsAsFactors = FALSE)

start_date<-as_date("2015-01-01")
end_date<-as_date("2018-12-31")

all_dates<-seq(start_date, end_date, by='1 day')

allcounties_alldates<-crossing(counties, all_dates)
0 голосов
/ 07 мая 2019

Я не совсем уверен, что вы хотите в качестве вывода ... но я думаю, что вы хотите функциональность tidyr: complete вместо expand?

например

using %>% 
    complete(month, nesting(county, year))


# A tibble: 35 x 4
   month county  year   day
   <dbl> <fct>  <dbl> <dbl>
 1     1 A       2015     1
 2     1 A       2016    NA
 3     1 A       2017    NA
 4     1 B       2015    NA
 5     1 B       2016    NA
 6     1 B       2017    NA
 7     1 B       2018    NA
 8     2 A       2015    NA
 9     2 A       2016     2
10     2 A       2017    NA
...