Измените структуру данных с длинных на широкие и наоборот - PullRequest
0 голосов
/ 12 марта 2020

У меня проблемы с командой reshpe. Я хотел бы изменить структуру данных с длинных на широкие и наоборот. Я также пробовал spread и reshape и dcast. Но я потерпел неудачу и не знаю почему. Вот мои данные и код

d1<-data.frame(ID=c("id1","id2","id3","id4"), year=c(2000,2001),val=c(8,7,9,8,2,3,5,6))

Я хотел бы поместить переменную ID в строку, как показано ниже.

  year id1 id2 id3 id4
  2000  8   9   2   5
  2001  7   8   3   6  

Я пробовал spread(d1, ID, val) и reshape(d1, ID, year,direction="wide") и dcast(d1, year~ID, rank) Но я получил ошибки.

Кто-нибудь может мне помочь? Благодаря.

1 Ответ

1 голос
/ 12 марта 2020

Здесь проблема с тем, как вы определили 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
...