Развернуть столбцы фрейма данных

#r #dataframe #data.table

#r #фрейм данных #данные.таблица

Вопрос:

Допустим, у меня есть data.frame или data.table следующего вида:

 df <- data.frame("date"=c("2012-11-07", "2012-11-07", "2012-11-08", "2012-11-08", "2012-11-06", "2012-11-06"),
                 "id"=c(1,2, 1, 2, 2, 1),
                 "val"=c(100, 101, 102, 103, 104, 105))
 

Мне нравится расширять это так, чтобы каждый id получал свой собственный столбец, содержащий val то, что соответствует заданному date , т. Е. Оно должно иметь вид

 df.new <- data.frame("date"=c("2012-11-06", "2012-11-07", "2012-11-08"),
                     "1"=c(105, 100, 102),
                     "2"=c(104, 101, 103))
 

Существует ли метод для data.frames или data.tables, который может это сделать?

Комментарии:

1. dcast.data.table или, если вы мазохист, база reshape .

2. cran.r-project.org/web/packages/data.table/vignettes/…

Ответ №1:

Работает ли это:

 library(dplyr)
library(tidyr)
df %>% pivot_wider(names_from = id, values_from = val, names_prefix = 'X')
# A tibble: 3 x 3
  date          X1    X2
  <chr>      <dbl> <dbl>
1 2012-11-07   100   101
2 2012-11-08   102   103
3 2012-11-06   105   104
 

Ответ №2:

С помощью data.table :

 library(data.table)
setDT(df)
dcast.data.table(df,date~id, value.var="val")
         date   1   2
1: 2012-11-06 105 104
2: 2012-11-07 100 101
3: 2012-11-08 102 103
 

Ответ №3:

С помощью dcast:

 dcast(df, date ~ id)

  date        1   2
1 2012-11-06 105 104
2 2012-11-07 100 101
3 2012-11-08 102 103
 

Ответ №4:

Базовый параметр R, использующий reshape

 reshape(
  df[with(df, order(date, id)), ],
  direction = "wide",
  idvar = "date",
  timevar = "id"
)
 

что дает

         date val.1 val.2
6 2012-11-06   105   104
1 2012-11-07   100   101
3 2012-11-08   102   103