Простые манипуляции с большим кадром данных в r - PullRequest
0 голосов
/ 04 марта 2020

У меня относительно большой фрейм данных. Он содержит примерно 40 миллионов строк и 12 столбцов, смотрите часть этого ниже. В частности, это усредненные данные по озону за 3 часа для округов США. Каждая строка представляет определенный округ и определенный день (с 19800101 по 20161231 для 3108 округов). Обратите внимание, что этот файл данных имеет размер 7,05 ГБ.

 index       date state.fips county.fp   X07.30   X10.30   X13.30   X16.30   X19.30   X21.30   X01.30   X04.30
1 01001 1980-01-01         01       001 29.98488 29.47778 29.12294 29.98976 31.69830 31.56405 30.48744 29.62118
2 01001 1980-01-02         01       001 29.03014 28.75464 28.58736 30.26555 32.39263 32.43746 31.70940 31.14960
3 01001 1980-01-03         01       001 30.69475 30.19832 29.68841 30.28920 31.61882 31.43047 31.01369 30.58366
4 01001 1980-01-04         01       001 30.20852 29.69874 29.47550 30.55639 32.62610 34.47959 35.54881 35.78104
5 01001 1980-01-05         01       001 35.80190 35.69129 35.89026 38.51287 39.82833 39.49016 38.73464 38.09185
6 01001 1980-01-06         01       001 37.32787 36.55899 35.96070 36.62670 37.03226 36.71239 35.86387 35.05945

Вопрос в том, что время в приведенных ниже столбцах указано в UT C, и мне нужно преобразовать в местное время США. Для США существует пять часовых поясов, а именно восточный часовой пояс, центральный часовой пояс, горный часовой пояс и часовой пояс Pacifi c. Да, я покрыл только смежные США. Как мне начать эту манипуляцию?

Также обратите внимание, что исходный файл данных большой (7,05 ГБ). Мы можем столкнуться с недостаточным количеством ошибок памяти. Я работаю на ноутбуке с 16 ГБ оперативной памяти.

Ниже я публикую свой код для этого. Однако я не могу добавить dplyr:case_when для настройки часовых поясов.

names(ozone) <- gsub("^X","", names(ozone)) # get rid of X in columns names

ozone <- pivot_longer(ozone, cols = c('01.30','04.30','07.30',
                                     '10.30','13.30','16.30','19.30','21.30'),
                                   names_to = 'time', values_to = 'ozone_val')

ozone$date <- ymd(ozone$date) # convert to date format

ozone$date = as.POSIXct(paste(ozone$date, ozone$time),
                             format = "%Y-%m-%d %H.%M",
                             tz = 'UTC')
ozone$date <- with_tz(ozone$date, "America/New_York") # how to apply case_when here

ozone$time <- substr(ozone$date, 12, 19)

ozone$year.day <- substr(ozone$date, 1, 10)

ozone <- subset(ozone, select = -date)

ozone_1 <- pivot_wider(ozone, id_cols = c('index','state.fips','county.fp','year.day'),
                     names_from = 'time', values_from = 'ozone_val')

Есть идеи?

1 Ответ

0 голосов
/ 04 марта 2020

Это должно помочь вам начать, но вам нужно будет опубликовать более полный воспроизводимый пример и / или дополнительную информацию о том, что именно вы ищете. Но вы должны иметь возможность использовать эту общую платформу, если у вас не хватает памяти (например, вы можете использовать что-то вроде dplyr::case_when() для создания часового пояса на основе состояния или поднабора после создания столбца POSIXct) , Надеюсь, это поможет вам!

Кроме того, я с удовольствием объясню все, что неясно!

library(data.table)

setDT(data)

names(data) <- gsub("^X", "", names(data))

dt <- melt(data, id.vars = c("index", "date", "state.fips", "county.fp"),
           variable.name = "time", value.name = "ozone_val")

dt[, date := as.POSIXct(paste(as.character(date), time), 
                        format = "%Y-%m-%d %H.%M",
                        tz = "America/New_York")]
print(dt, nrows = 10)

   index                date state.fips county.fp  time ozone_val
 1:  1001 1980-01-01 07:30:00          1         1 07.30  29.98488
 2:  1001 1980-01-02 07:30:00          1         1 07.30  29.03014
 3:  1001 1980-01-03 07:30:00          1         1 07.30  30.69475
 4:  1001 1980-01-04 07:30:00          1         1 07.30  30.20852
 5:  1001 1980-01-05 07:30:00          1         1 07.30  35.80190
---                                                               
44:  1001 1980-01-02 04:30:00          1         1 04.30  31.14960
45:  1001 1980-01-03 04:30:00          1         1 04.30  30.58366
46:  1001 1980-01-04 04:30:00          1         1 04.30  35.78104
47:  1001 1980-01-05 04:30:00          1         1 04.30  38.09185
48:  1001 1980-01-06 04:30:00          1         1 04.30  35.05945

Данные :

data <- read.table(header = T, text = "index       date state.fips county.fp   X07.30   X10.30   X13.30   X16.30   X19.30   X21.30   X01.30   X04.30
1 01001 1980-01-01         01       001 29.98488 29.47778 29.12294 29.98976 31.69830 31.56405 30.48744 29.62118
2 01001 1980-01-02         01       001 29.03014 28.75464 28.58736 30.26555 32.39263 32.43746 31.70940 31.14960
3 01001 1980-01-03         01       001 30.69475 30.19832 29.68841 30.28920 31.61882 31.43047 31.01369 30.58366
4 01001 1980-01-04         01       001 30.20852 29.69874 29.47550 30.55639 32.62610 34.47959 35.54881 35.78104
5 01001 1980-01-05         01       001 35.80190 35.69129 35.89026 38.51287 39.82833 39.49016 38.73464 38.09185
6 01001 1980-01-06         01       001 37.32787 36.55899 35.96070 36.62670 37.03226 36.71239 35.86387 35.05945")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...