Здесь проблема с тем, как вы определили d1
. В частности, вы определили его содержимое как три вектора различной длины. В принципе, это нормально, поскольку data.frame
будет эффективно перерабатывать векторы, чтобы привести их к одинаковой длине. Проблема состоит в том, что способ, которым осуществляется эта переработка, несовместим с широким форматом, который вы в конечном итоге хотите получить. Мы можем показать, что с помощью pivot_wider()
- одного из последних дополнений к пакету tidyr
:
d1 <-
data.frame(
ID = c("id1", "id2", "id3", "id4"),
year = c(2000, 2001),
val = c(8, 7, 9, 8, 2, 3, 5, 6)
)
tidyr::pivot_wider(d1, names_from = ID, values_from = val)
#> Warning: Values in `val` are not uniquely identified; output will contain list-cols.
#> * Use `values_fn = list(val = list)` to suppress this warning.
#> * Use `values_fn = list(val = length)` to identify where the duplicates arise
#> * Use `values_fn = list(val = summary_fun)` to summarise duplicates
#> # A tibble: 2 x 5
#> year id1 id2 id3 id4
#> <dbl> <list> <list> <list> <list>
#> 1 2000 <dbl [2]> <NULL> <dbl [2]> <NULL>
#> 2 2001 <NULL> <dbl [2]> <NULL> <dbl [2]>
Обратите внимание, что, хотя команда не выдавала ошибку, полученные результаты, безусловно, не дают соответствуют тому, что вы ожидали получить. К счастью, исправить это так же просто, как правильно определить столбцы входного фрейма данных. Ниже я сделал это для d2
и показал результаты, полученные pivot_wider()
. Я считаю, что это соответствует тому, что вы ожидали получить?
d2 <- data.frame(
ID = c("id1", "id1", "id2", "id2", "id3", "id3", "id4", "id4"),
year = c(2000, 2001, 2000, 2001, 2000, 2001, 2000, 2001),
val = c(8, 7, 9, 8, 2, 3, 5, 6)
)
tidyr::pivot_wider(d2, names_from = ID, values_from = val)
#> # A tibble: 2 x 5
#> year id1 id2 id3 id4
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2000 8 9 2 5
#> 2 2001 7 8 3 6
Кроме того, если вы используете d2
в качестве входных данных, ваша команда распространения должна давать те же результаты, что и pivot_wider()
:
tidyr::spread(d2, ID, val)
#> year id1 id2 id3 id4
#> 1 2000 8 9 2 5
#> 2 2001 7 8 3 6