Я хочу преобразовать длинный в широкий формат моих данных, используя data.table. Обычно я использую unstack(), но не знаю, как это сделать в data.table. Ниже приведен пример. В качестве вывода я ожидаю три столбца и три строки.
library(data.table)
set.seed(1)
df <- data.frame(class = factor(rep(c("A", "B", "C"), times = 3)),
value = runif (9))
unstack(df, form = value ~ class)
#> A B C
#> 1 0.2655087 0.3721239 0.5728534
#> 2 0.9082078 0.2016819 0.8983897
#> 3 0.9446753 0.6607978 0.6291140
dt <- data.table(df)
dcast(dt, formula = value ~ class, value.var = "value")
#> value A B C
#> 1: 0.2016819 NA 0.2016819 NA
#> 2: 0.2655087 0.2655087 NA NA
#> 3: 0.3721239 NA 0.3721239 NA
#> 4: 0.5728534 NA NA 0.5728534
#> 5: 0.6291140 NA NA 0.6291140
#> 6: 0.6607978 NA 0.6607978 NA
#> 7: 0.8983897 NA NA 0.8983897
#> 8: 0.9082078 0.9082078 NA NA
#> 9: 0.9446753 0.9446753 NA NA
Кроме того, я не хочу использовать агрегатную функцию, но в data.table на реальных данных я вижу: Aggregate function missing, defaulting to 'length', поэтому в результате меньше строк.





Я думаю, это то, что вы хотите:
dcast(dt, rowid(class) ~ class)
# class A B C
#1: 1 0.2655087 0.3721239 0.5728534
#2: 2 0.9082078 0.2016819 0.8983897
#3: 3 0.9446753 0.6607978 0.6291140
Мы можем попробовать split внутри dt, как показано ниже (но эта опция доступна только в том случае, если у нас одинаковое количество значений в классе, поэтому для общих случаев рекомендуется использовать опцию dcast от @M.Viking)
> dt[, split(value, class)]
A B C
1: 0.2655087 0.3721239 0.5728534
2: 0.9082078 0.2016819 0.8983897
3: 0.9446753 0.6607978 0.6291140
@nukubiho, вероятно, это правда, потому что он на самом деле не поворачивает оригинал dt, а реорганизует данные class
Также кажется, что
split()в несколько раз быстрее, чемdcast()на большом наборе данных.