#r #tidyr #tsibble
#r #tidyr #tsibble
Вопрос:
Я не понимаю, как я могу отменить проверку столбца списка файлов. Недавно я обновил R-версию старого проекта, что привело к нерабочему коду.
Пример данных:
library(tidyverse)
library(fable)
library(tsibble)
library(tsibbledata)
data <- tsibbledata::hh_budget
data
# A tsibble: 88 x 8 [1Y]
# Key: Country [4]
Country Year Debt DI Expenditure Savings Wealth Unemployment
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Australia 1995 95.7 3.72 3.40 5.24 315. 8.47
2 Australia 1996 99.5 3.98 2.97 6.47 315. 8.51
3 Australia 1997 108. 2.52 4.95 3.74 323. 8.36
4 Australia 1998 115. 4.02 5.73 1.29 339. 7.68
5 Australia 1999 121. 3.84 4.26 0.638 354. 6.87
6 Australia 2000 126. 3.77 3.18 1.99 350. 6.29
7 Australia 2001 132. 4.36 3.10 3.24 348. 6.74
8 Australia 2002 149. 0.0218 4.03 -1.15 349. 6.37
9 Australia 2003 159. 6.06 5.04 -0.413 360. 5.93
10 Australia 2004 170. 5.53 4.54 0.657 379. 5.40
# ... with 78 more rows
вложите данные:
data_nested <- data %>%
nest(data = c(-Country))
Это также будет выполнять ту же вложенность:
data_nested <- data %>%
group_by_key() %>%
nest()
data_nested
Приводит к этому:
# A tibble: 4 x 2
# Groups: Country [4]
Country data
<chr> <list>
1 Australia <tsibble [22 x 7]>
2 Canada <tsibble [22 x 7]>
3 Japan <tsibble [22 x 7]>
4 USA <tsibble [22 x 7]>
Теперь я хотел бы отменить проверку этого, я хотел бы получить то же, что и входные данные, tsibble с 88 строками, ключ: Country [4], …
Тогда я использовал это:
tsibble::unnest_tsibble(data_nested, cols = data)
Выдает сообщение об ошибке, которое я вообще не понимаю.
Error in if (unknown_interval(interval) amp;amp; (nrows > vec_size(key_data))) { :
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In min(..., na.rm = TRUE) :
no non-missing arguments to min; returning Inf
2: In max(..., na.rm = TRUE) :
no non-missing arguments to max; returning -Inf
Я знаю, что были эти обновления, я немного поиграл с unnest_wider и unnest_longer и unnest_legacy.
unnest_longer(data_nested, col = data)
Error in if (unknown_interval(interval) amp;amp; (nrows > vec_size(key_data))) { :
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In min(..., na.rm = TRUE) :
no non-missing arguments to min; returning Inf
2: In max(..., na.rm = TRUE) :
no non-missing arguments to max; returning -Inf
Unnest legacy допускает только tibbles…
unnest_legacy(data_nested)
Error: The result is not a valid tsibble.
i Do you need `as_tibble()` to work with data frame?
Единственное, что сработало, действительно громоздко:
data_again_unnested <- data_nested %>%
unnest_wider(data) %>%
unnest(cols = c(-Country))
data_again_unnested
# A tibble: 88 x 8
Country Year Debt DI Expenditure Savings Wealth Unemployment
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Australia 1995 95.7 3.72 3.40 5.24 315. 8.47
2 Australia 1996 99.5 3.98 2.97 6.47 315. 8.51
3 Australia 1997 108. 2.52 4.95 3.74 323. 8.36
4 Australia 1998 115. 4.02 5.73 1.29 339. 7.68
5 Australia 1999 121. 3.84 4.26 0.638 354. 6.87
6 Australia 2000 126. 3.77 3.18 1.99 350. 6.29
7 Australia 2001 132. 4.36 3.10 3.24 348. 6.74
8 Australia 2002 149. 0.0218 4.03 -1.15 349. 6.37
9 Australia 2003 159. 6.06 5.04 -0.413 360. 5.93
10 Australia 2004 170. 5.53 4.54 0.657 379. 5.40
# ... with 78 more rows
Но он, конечно, выводит tibble, поэтому мне снова нужно будет принудительно вернуть его к tsibble, это довольно раздражает, много шагов, только для простого unnest.
data_again_unnested %>% as_tsibble(key = Country, index = Year)
# A tsibble: 88 x 8 [1Y]
# Key: Country [4]
Country Year Debt DI Expenditure Savings Wealth Unemployment
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Australia 1995 95.7 3.72 3.40 5.24 315. 8.47
2 Australia 1996 99.5 3.98 2.97 6.47 315. 8.51
3 Australia 1997 108. 2.52 4.95 3.74 323. 8.36
4 Australia 1998 115. 4.02 5.73 1.29 339. 7.68
5 Australia 1999 121. 3.84 4.26 0.638 354. 6.87
6 Australia 2000 126. 3.77 3.18 1.99 350. 6.29
7 Australia 2001 132. 4.36 3.10 3.24 348. 6.74
8 Australia 2002 149. 0.0218 4.03 -1.15 349. 6.37
9 Australia 2003 159. 6.06 5.04 -0.413 360. 5.93
10 Australia 2004 170. 5.53 4.54 0.657 379. 5.40
# ... with 78 more rows
Нет ли другого способа сделать это? У кого-нибудь есть идея?
Комментарии:
1. Функция
unnest_tsibble
устарела2. Я знаю, что unnest_tsibble устарел. Я сказал, что использовал его в своем старом коде. Мой вопрос в том, есть ли другой способ отменить список столбцов tsibble вместо этого громоздкого обходного пути. Когда обновление приводит к переключению с одной строки на три, кажется, что что-то не так.
3. Привет, Nhaj, на самом деле хороший вопрос.. Функция, которая приводит к этой проблеме, —
vctrs::vec_unchop
[try:vctrs::vec_unchop(data_nested$data)
] . Единственное решение, которое я нашелdata %>% nest_by(Country) %>% unnest(data)
, но оно возвращает tibble вместо tsibble .. все еще ищет..4. таким образом, вы успешно отменяете проверку столбца и создаете уникальный tsibble :
vctrs::vec_unchop(data_nested$data, indices = tsibble::key_rows(data))
. Однако нет способа передать этуindeces
информацию вvec_unchop