Как разделить мой фрейм данных на списки равной длины

Я работаю с большой базой данных и пытаюсь разделить панель баланса на сбалансированные панели, чтобы выполнить регрессию цикла plm.

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

bb3

Первая попытка

После этого вопрос Я пытался использовать split.default :

n<-6
f<-gl(n,nrow(bb3) / n )
B<-split.default(bb3, f)

B близко к тому, что я хочу, но только для моего первого списка B[["1"]] остальные 5 списков пусты, и я получаю следующую ошибку:

Warning message:
In split.default(bb3, f) : data length is not a multiple of split variable

TL:DR Я хочу создать список, разделенный на 6 фрагментов, каждый из которых содержит 102 clvs с последовательными date. Даже если они не сбалансированы, если они идут последовательно, я могу сбалансировать их с помощью make.pbalanced. Это будет моим идеальным решением

Вторая попытка

Я сгенерировал Index для идентификации каждого date из каждого clvs (Index уже сгенерировано в bb3, но ради упражнения я объясню, как я это сделал)

bb3<- bb3 %>% 
  group_by(clvs) %>% 
  mutate(Index = row_number())

Проблема в том, что я не знаю, как его разделить:

si<-split.data.frame(bb3,bb3$Index)

Опять же, si близко относится к тому, что мне нужно, он дает мне список из 551 балансового списка (102 clvs и один date). Я хочу разделить bb3 на 19 сегментов Index. Этот список (1:19,20:39,40:59,...) определит, как я разделю свой фрейм данных

Я уверен, что должен быть простой способ с function и lapply, но я не могу найти это решение.

TL:DR Я хочу разделить свой фрейм данных на 19 фрагментов, каждый фрагмент со 102 clvs каждый с 29 периодами date: список из 19 фрагментов с 2958 наблюдениями в каждом

Любая помощь будет высоко ценится

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

Решение, которое я получил от @Allan Cameron, сократило мою базу данных до нужного мне размера, но оно не работает как панель баланса, потому что оно не сокращает последовательно мои datetime

B <- split(bb3, 1:6)
head(B[["6"]])
clvs  fecha hora    pml pml_ene pml_per pml_cng datetime date               
  <fct> <chr> <chr> <dbl>   <dbl>   <dbl>   <dbl> <fct>    <dttm>             
1 07AC~ 2017~ 6      389.    388.    1.07       0 2017-02~ 2017-02-28 07:00:00
2 07AC~ 2017~ 12     677.    674.    3.25       0 2017-02~ 2017-02-28 13:00:00
3 07AC~ 2017~ 18     667.    664.    3.15       0 2017-02~ 2017-02-28 19:00:00
4 07AC~ 2017~ 24     666.    664.    2.44       0 2017-03~ 2017-03-01 01:00:00
5 07AC~ 2017~ 6      664.    662.    2.05       0 2017-03~ 2017-03-01 07:00:00
6 07AC~ 2017~ 12     434.    431.    2.97       0 2017-03~ 2017-03-01 13:00:00

tail(B[["6"]])

clvs  fecha hora    pml pml_ene pml_per pml_cng datetime date               
  <fct> <chr> <chr> <dbl>   <dbl>   <dbl>   <dbl> <fct>    <dttm>             
1 07XC~ 2017~ 18     430.    443.  -13.6        0 2017-03~ 2017-03-21 19:00:00
2 07XC~ 2017~ 24     418.    426.   -8.41       0 2017-03~ 2017-03-22 01:00:00
3 07XC~ 2017~ 6      442.    444.   -2.15       0 2017-03~ 2017-03-22 07:00:00
4 07XC~ 2017~ 12     451.    464.  -12.4        0 2017-03~ 2017-03-22 13:00:00
5 07XC~ 2017~ 18     450.    461.  -11.2        0 2017-03~ 2017-03-22 19:00:00
6 07XC~ 2017~ 24     452.    467.  -15          0 2017-03~ 2017-03-23 01:00:00

Так что я до сих пор не могу ни сбалансировать свою панель, ни использовать ее с plm

Как я могу разбить его на 6 с последовательными датами?


person Lilia    schedule 09.10.2020    source источник
comment
Ваш split работает, если вы используете split, а не split.default?   -  person Allan Cameron    schedule 09.10.2020
comment
Когда я использую split, он не дает мне сообщения Warning, но в каждом списке есть только 17 clvs, и мне нужно 102 clvs в каждом списке B[[i]]   -  person Lilia    schedule 09.10.2020
comment
Привет, Лила, я вижу, ты не приняла мой ответ. Есть ли проблема с этим? Дайте мне знать, если я могу помочь.   -  person Allan Cameron    schedule 11.10.2020
comment
Спасибо, что спросили @AllanCameron, можете ли вы проверить мою правку в исходном сообщении? Мой фрейм данных не содержит последовательной даты. В каждом списке есть 3 непоследовательных часа на каждый день. Я хочу, чтобы первые 92 часа периода (2017-02-28 1:00 до 2017-03-03 23:00) для 102 clvs в первом списке, затем следующие 92 часа во втором и в хронологическом порядке , есть способ?   -  person Lilia    schedule 11.10.2020


Ответы (2)


Ты можешь сделать

B <- split(bb3, 1:6)

Таким образом, B представляет собой список фреймов данных, каждый из которых содержит 9367 строк:

sapply(B, nrow)
#>    0    1    2    3    4    5 
#> 9367 9367 9367 9367 9367 9367 

И каждый содержит все clvs примерно в равных количествах:

sapply(B, function(x) table(x$clvs))
#>            1  2  3  4  5  6
#> 07ACU-115 92 92 92 92 92 91
#> 07APD-230 92 92 92 92 91 92
#> 07BJO-69  92 92 92 91 92 92
#> 07CAE-69  92 92 91 92 92 92
#> 07CES-69  92 91 92 92 92 92
#> 07CHQ-230 91 92 92 92 92 92
#> 07CIP-115 92 92 92 92 92 91
#> 07CME-115 92 92 92 92 91 92
#> 07CNA-69  92 92 92 91 92 92
#> 07CNT-230 92 92 91 92 92 92
#> 07CNZ-161 92 91 92 92 92 92
#> 07COE-115 91 92 92 92 92 92
#> 07CPC-161 92 92 92 92 92 91
#> 07CPD-230 92 92 92 92 91 92
#> 07CPT-230 92 92 92 91 92 92
#> 07CPU-161 92 92 91 92 92 92
#> 07CRO-161 92 91 92 92 92 92
#> 07CSC-230 91 92 92 92 92 92
#> 07CTY-161 92 92 92 92 92 91
#> 07CTY-230 92 92 92 92 91 92
#> 07DRA-69  92 92 92 91 92 92
#> 07EDA-115 92 92 91 92 92 92
#> 07END-69  92 91 92 92 92 92
#> 07ENT-115 91 92 92 92 92 92
#> 07EPC-115 92 92 92 92 92 91
#> 07FCO-69  92 92 92 92 91 92
#> 07FEV-161 92 92 92 91 92 92
#> 07FLO-69  92 92 91 92 92 92
#> 07FMO-115 92 91 92 92 92 92
#> 07FOR-69  91 92 92 92 92 92
#> 07FTA-69  92 92 92 92 92 91
#> 07GER-69  92 92 92 92 91 92
#> 07GLL-115 92 92 92 91 92 92
#> 07GOR-161 92 92 91 92 92 92
#> 07HGO-161 92 91 92 92 92 92
#> 07HMO-69  91 92 92 92 92 92
#> 07HUN-69  92 92 92 92 92 91
#> 07INA-69  92 92 92 92 91 92
#> 07IOP-69  92 92 92 91 92 92
#> 07JAT-115 92 92 91 92 92 92
#> 07JOV-230 92 91 92 92 92 92
#> 07JOY-115 91 92 92 92 92 92
#> 07KCH-161 92 92 92 92 92 91
#> 07LGO-69  92 92 92 92 91 92
#> 07LMS-69  92 92 92 91 92 92
#> 07LOS-115 92 92 91 92 92 92
#> 07MAB-69  92 91 92 92 92 92
#> 07MEP-230 91 92 92 92 92 92
#> 07MEP-69  92 92 92 92 92 91
#> 07MND-115 92 92 92 92 91 92
#> 07MOE-161 92 92 92 91 92 92
#> 07MSN-115 92 92 91 92 92 92
#> 07MXC-69  92 91 92 92 92 92
#> 07MXI-161 91 92 92 92 92 92
#> 07MXI-230 92 92 92 92 92 91
#> 07NEL-69  92 92 92 92 91 92
#> 07NZI-161 92 92 92 91 92 92
#> 07ONG-69  92 92 91 92 92 92
#> 07OZA-230 92 91 92 92 92 92
#> 07PAF-69  91 92 92 92 92 92
#> 07PAP-69  92 92 92 92 92 91
#> 07PID-161 92 92 92 92 91 92
#> 07PID-230 92 92 92 91 92 92
#> 07PJZ-115 92 92 91 92 92 92
#> 07PJZ-230 92 91 92 92 92 92
#> 07PKD-161 91 92 92 92 92 92
#> 07PNM-115 92 92 92 92 92 91
#> 07PNU-115 92 92 92 92 91 92
#> 07POP-115 92 92 92 91 92 92
#> 07RII-69  92 92 91 92 92 92
#> 07RIN-161 92 91 92 92 92 92
#> 07RSI-69  91 92 92 92 92 92
#> 07RUB-69  92 92 92 92 92 91
#> 07RUM-69  92 92 92 92 91 92
#> 07RZC-161 92 92 92 91 92 92
#> 07SAF-115 92 92 91 92 92 92
#> 07SAZ-115 92 91 92 92 92 92
#> 07SED-69  91 92 92 92 92 92
#> 07SHA-115 92 92 92 92 92 91
#> 07SIO-69  92 92 92 92 91 92
#> 07SIS-161 92 92 92 91 92 92
#> 07SMN-115 92 92 91 92 92 92
#> 07SQN-115 92 91 92 92 92 92
#> 07SRY-230 91 92 92 92 92 92
#> 07STB-230 92 92 92 92 92 91
#> 07SVE-115 92 92 92 92 91 92
#> 07TCD-69  92 92 92 91 92 92
#> 07TCT-69  92 92 91 92 92 92
#> 07TEE-69  92 91 92 92 92 92
#> 07TEK-230 91 92 92 92 92 92
#> 07TJD-69  92 92 92 92 92 91
#> 07TJI-69  92 92 92 92 91 92
#> 07TOY-230 92 92 92 91 92 92
#> 07TRI-115 92 92 91 92 92 92
#> 07UND-69  92 91 92 92 92 92
#> 07VAS-69  91 92 92 92 92 92
#> 07VIG-69  92 92 92 92 92 91
#> 07VLP-69  92 92 92 92 91 92
#> 07VPA-230 92 92 92 91 92 92
#> 07VPM-69  92 92 91 92 92 92
#> 07WIS-230 92 91 92 92 92 92
#> 07XCO-230 91 92 92 92 92 92

И каждый содержит по 17 экземпляров каждого datetime:

sapply(B, function(x) table(as.character(x$datetime)))
#>                      1  2  3  4  5  6
#> 2017-02-28 01:00:00 17 17 17 17 17 17
#> 2017-02-28 02:00:00 17 17 17 17 17 17
#> 2017-02-28 03:00:00 17 17 17 17 17 17
#> 2017-02-28 04:00:00 17 17 17 17 17 17
#> 2017-02-28 05:00:00 17 17 17 17 17 17
#> 2017-02-28 06:00:00 17 17 17 17 17 17
#> 2017-02-28 07:00:00 17 17 17 17 17 17
#> 2017-02-28 08:00:00 17 17 17 17 17 17
#> 2017-02-28 09:00:00 17 17 17 17 17 17
#> 2017-02-28 10:00:00 17 17 17 17 17 17
#> 2017-02-28 11:00:00 17 17 17 17 17 17
#> 2017-02-28 12:00:00 17 17 17 17 17 17
#> 2017-02-28 13:00:00 17 17 17 17 17 17
#> 2017-02-28 14:00:00 17 17 17 17 17 17
#> 2017-02-28 15:00:00 17 17 17 17 17 17
#> 2017-02-28 16:00:00 17 17 17 17 17 17
#> 2017-02-28 17:00:00 17 17 17 17 17 17
#> 2017-02-28 18:00:00 17 17 17 17 17 17
#> 2017-02-28 19:00:00 17 17 17 17 17 17
#> 2017-02-28 20:00:00 17 17 17 17 17 17
#> 2017-02-28 21:00:00 17 17 17 17 17 17
#> 2017-02-28 22:00:00 17 17 17 17 17 17
#> 2017-02-28 23:00:00 17 17 17 17 17 17
#> 2017-03-01 00:00:00 17 17 17 17 17 17
#> 2017-03-01 01:00:00 17 17 17 17 17 17
#> 2017-03-01 02:00:00 17 17 17 17 17 17
#> 2017-03-01 03:00:00 17 17 17 17 17 17
#> 2017-03-01 04:00:00 17 17 17 17 17 17
#> 2017-03-01 05:00:00 17 17 17 17 17 17
#> 2017-03-01 06:00:00 17 17 17 17 17 17
#> 2017-03-01 07:00:00 17 17 17 17 17 17
#> 2017-03-01 08:00:00 17 17 17 17 17 17
#> 2017-03-01 09:00:00 17 17 17 17 17 17
#> 2017-03-01 10:00:00 17 17 17 17 17 17
#> 2017-03-01 11:00:00 17 17 17 17 17 17
#> 2017-03-01 12:00:00 17 17 17 17 17 17
#> 2017-03-01 13:00:00 17 17 17 17 17 17
#> 2017-03-01 14:00:00 17 17 17 17 17 17
#> 2017-03-01 15:00:00 17 17 17 17 17 17
#> 2017-03-01 16:00:00 17 17 17 17 17 17
#> 2017-03-01 17:00:00 17 17 17 17 17 17
#> 2017-03-01 18:00:00 17 17 17 17 17 17
#> 2017-03-01 19:00:00 17 17 17 17 17 17
#> 2017-03-01 20:00:00 17 17 17 17 17 17
#> 2017-03-01 21:00:00 17 17 17 17 17 17
#> 2017-03-01 22:00:00 17 17 17 17 17 17
#> 2017-03-01 23:00:00 17 17 17 17 17 17
#> 2017-03-02 00:00:00 17 17 17 17 17 17
#> 2017-03-02 01:00:00 17 17 17 17 17 17
#> 2017-03-02 02:00:00 17 17 17 17 17 17
#> 2017-03-02 03:00:00 17 17 17 17 17 17
#> 2017-03-02 04:00:00 17 17 17 17 17 17
#> 2017-03-02 05:00:00 17 17 17 17 17 17
#> 2017-03-02 06:00:00 17 17 17 17 17 17
#> 2017-03-02 07:00:00 17 17 17 17 17 17
#> 2017-03-02 08:00:00 17 17 17 17 17 17
#> 2017-03-02 09:00:00 17 17 17 17 17 17
#> 2017-03-02 10:00:00 17 17 17 17 17 17
#> 2017-03-02 11:00:00 17 17 17 17 17 17
#> 2017-03-02 12:00:00 17 17 17 17 17 17
#> 2017-03-02 13:00:00 17 17 17 17 17 17
#> 2017-03-02 14:00:00 17 17 17 17 17 17
#> 2017-03-02 15:00:00 17 17 17 17 17 17
#> 2017-03-02 16:00:00 17 17 17 17 17 17
#> 2017-03-02 17:00:00 17 17 17 17 17 17
#> 2017-03-02 18:00:00 17 17 17 17 17 17
#> 2017-03-02 19:00:00 17 17 17 17 17 17
#> 2017-03-02 20:00:00 17 17 17 17 17 17
#> 2017-03-02 21:00:00 17 17 17 17 17 17
#> 2017-03-02 22:00:00 17 17 17 17 17 17
#> 2017-03-02 23:00:00 17 17 17 17 17 17
#> 2017-03-03 00:00:00 17 17 17 17 17 17
#> 2017-03-03 01:00:00 17 17 17 17 17 17
#> 2017-03-03 02:00:00 17 17 17 17 17 17
#> 2017-03-03 03:00:00 17 17 17 17 17 17
#> 2017-03-03 04:00:00 17 17 17 17 17 17
#> 2017-03-03 05:00:00 17 17 17 17 17 17
#> 2017-03-03 06:00:00 17 17 17 17 17 17
#> 2017-03-03 07:00:00 17 17 17 17 17 17
#> 2017-03-03 08:00:00 17 17 17 17 17 17
#> 2017-03-03 09:00:00 17 17 17 17 17 17
#> 2017-03-03 10:00:00 17 17 17 17 17 17
#> 2017-03-03 11:00:00 17 17 17 17 17 17
#> 2017-03-03 12:00:00 17 17 17 17 17 17
#> 2017-03-03 13:00:00 17 17 17 17 17 17
#> 2017-03-03 14:00:00 17 17 17 17 17 17
#> 2017-03-03 15:00:00 17 17 17 17 17 17
#> 2017-03-03 16:00:00 17 17 17 17 17 17
#> 2017-03-03 17:00:00 17 17 17 17 17 17
#> 2017-03-03 18:00:00 17 17 17 17 17 17
#> 2017-03-03 19:00:00 17 17 17 17 17 17
#> 2017-03-03 20:00:00 17 17 17 17 17 17
#> 2017-03-03 21:00:00 17 17 17 17 17 17
#> 2017-03-03 22:00:00 17 17 17 17 17 17
#> 2017-03-03 23:00:00 17 17 17 17 17 17
#> 2017-03-04 00:00:00 17 17 17 17 17 17
#> 2017-03-04 01:00:00 17 17 17 17 17 17
#> 2017-03-04 02:00:00 17 17 17 17 17 17
#> 2017-03-04 03:00:00 17 17 17 17 17 17
#> 2017-03-04 04:00:00 17 17 17 17 17 17
#> 2017-03-04 05:00:00 17 17 17 17 17 17
#> 2017-03-04 06:00:00 17 17 17 17 17 17
#> 2017-03-04 07:00:00 17 17 17 17 17 17
#> 2017-03-04 08:00:00 17 17 17 17 17 17
#> 2017-03-04 09:00:00 17 17 17 17 17 17
#> 2017-03-04 10:00:00 17 17 17 17 17 17
#> 2017-03-04 11:00:00 17 17 17 17 17 17
#> 2017-03-04 12:00:00 17 17 17 17 17 17
#> 2017-03-04 13:00:00 17 17 17 17 17 17
#> 2017-03-04 14:00:00 17 17 17 17 17 17
#> 2017-03-04 15:00:00 17 17 17 17 17 17
#> 2017-03-04 16:00:00 17 17 17 17 17 17
#> 2017-03-04 17:00:00 17 17 17 17 17 17
#> 2017-03-04 18:00:00 17 17 17 17 17 17
#> 2017-03-04 19:00:00 17 17 17 17 17 17
#> 2017-03-04 20:00:00 17 17 17 17 17 17
#> 2017-03-04 21:00:00 17 17 17 17 17 17
#> 2017-03-04 22:00:00 17 17 17 17 17 17
#> 2017-03-04 23:00:00 17 17 17 17 17 17
#> 2017-03-05 00:00:00 17 17 17 17 17 17
#> 2017-03-05 01:00:00 17 17 17 17 17 17
#> 2017-03-05 02:00:00 17 17 17 17 17 17
#> 2017-03-05 03:00:00 17 17 17 17 17 17
#> 2017-03-05 04:00:00 17 17 17 17 17 17
#> 2017-03-05 05:00:00 17 17 17 17 17 17
#> 2017-03-05 06:00:00 17 17 17 17 17 17
#> 2017-03-05 07:00:00 17 17 17 17 17 17
#> 2017-03-05 08:00:00 17 17 17 17 17 17
#> 2017-03-05 09:00:00 17 17 17 17 17 17
#> 2017-03-05 10:00:00 17 17 17 17 17 17
#> 2017-03-05 11:00:00 17 17 17 17 17 17
#> 2017-03-05 12:00:00 17 17 17 17 17 17
#> 2017-03-05 13:00:00 17 17 17 17 17 17
#> 2017-03-05 14:00:00 17 17 17 17 17 17
#> 2017-03-05 15:00:00 17 17 17 17 17 17
#> 2017-03-05 16:00:00 17 17 17 17 17 17
#> 2017-03-05 17:00:00 17 17 17 17 17 17
#> 2017-03-05 18:00:00 17 17 17 17 17 17
#> 2017-03-05 19:00:00 17 17 17 17 17 17
#> 2017-03-05 20:00:00 17 17 17 17 17 17
#> 2017-03-05 21:00:00 17 17 17 17 17 17
#> 2017-03-05 22:00:00 17 17 17 17 17 17
#> 2017-03-05 23:00:00 17 17 17 17 17 17
#> 2017-03-06 00:00:00 17 17 17 17 17 17
#> 2017-03-06 01:00:00 17 17 17 17 17 17
#> 2017-03-06 02:00:00 17 17 17 17 17 17
#> 2017-03-06 03:00:00 17 17 17 17 17 17
#> 2017-03-06 04:00:00 17 17 17 17 17 17
#> 2017-03-06 05:00:00 17 17 17 17 17 17
#> 2017-03-06 06:00:00 17 17 17 17 17 17
#> 2017-03-06 07:00:00 17 17 17 17 17 17
#> 2017-03-06 08:00:00 17 17 17 17 17 17
#> 2017-03-06 09:00:00 17 17 17 17 17 17
#> 2017-03-06 10:00:00 17 17 17 17 17 17
#> 2017-03-06 11:00:00 17 17 17 17 17 17
#> 2017-03-06 12:00:00 17 17 17 17 17 17
#> 2017-03-06 13:00:00 17 17 17 17 17 17
#> 2017-03-06 14:00:00 17 17 17 17 17 17
#> 2017-03-06 15:00:00 17 17 17 17 17 17
#> 2017-03-06 16:00:00 17 17 17 17 17 17
#> 2017-03-06 17:00:00 17 17 17 17 17 17
#> 2017-03-06 18:00:00 17 17 17 17 17 17
#> 2017-03-06 19:00:00 17 17 17 17 17 17
#> 2017-03-06 20:00:00 17 17 17 17 17 17
#> 2017-03-06 21:00:00 17 17 17 17 17 17
#> 2017-03-06 22:00:00 17 17 17 17 17 17
#>  [ reached getOption("max.print") -- omitted 385 rows ]

person Allan Cameron    schedule 09.10.2020

Хотя это кажется простой задачей, было очень сложно разделить данные сбалансированной панели на небольшие панели баланса.

@ Ответ Аллана Кэмерона дал правильный ответ по длине списка, но не по содержанию. Мои панели были несбалансированными, каждая clvs имела 188 или 187 в одном фрагменте, а datetime не была последовательной. Например, B[["1"]] имел последовательность 7:00, 13:00 и 19:00 для одного clvs. С несбалансированными панелями мой цикл с функцией splm не работал.

Решение использовало gl.unequal :

library(DTK)
f<-gl.unequal(n=6,k=c(92,92,92,92,92,91))
B<-split(bb3,f)

Таким образом я получаю сбалансированные панели, например B[["1"]]

head(B3[["1"]])
1 07AC~ 2017~ 1      686.    684.    2.19       0 2017-02~ 2017-02-28 02:00:00
2 07AC~ 2017~ 2      665.    664.    1.79       0 2017-02~ 2017-02-28 03:00:00
3 07AC~ 2017~ 3      393.    392.    1.11       0 2017-02~ 2017-02-28 04:00:00
4 07AC~ 2017~ 4      383.    381.    1.4        0 2017-02~ 2017-02-28 05:00:00
5 07AC~ 2017~ 5      383.    381.    1.41       0 2017-02~ 2017-02-28 06:00:00
6 07AC~ 2017~ 6      389.    388.    1.07       0 2017-02~ 2017-02-28 07:00:00

is.pbalanced(B[["1"]])
TRUE
person Lilia    schedule 12.10.2020