#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
.
Ответ №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