У меня есть data.table DT
Как я могу изменить мой data.table эффективно
set.seed(1)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))
DT
x y v
1: 1 A 29
2: 1 B 92
3: 1 A 100
4: 1 B 82
5: 2 A 28
6: 2 B 26
7: 2 A 18
8: 2 B 22
9: 3 A 30
10: 3 B 96
11: 3 A 15
12: 3 B 4
Я хотел бы расширить его как сильфона, создавая новый столбец для каждого значения x
и отчетности v
значения, ни одна структуры в данных не следует ожидать (не блоки, как сильфон)
x y v.1 v.2 v.3
1: 1 A 29 NA NA
2: 1 B 92 NA NA
3: 1 A 100 NA NA
4: 1 B 82 NA NA
5: 2 A NA 28 NA
6: 2 B NA 26 NA
7: 2 A NA 18 NA
8: 2 B NA 22 NA
9: 3 A NA NA 30
10: 3 B NA NA 96
11: 3 A NA NA 15
12: 3 B NA NA 4
я задавал очень похожий вопрос here но не адаптируюсь ответ G Гротендик дал нам в то время ...
EDIT: Как обычно, я просто получил его после того, как написал запись ... Мне просто нужно заменить эти 0 на NA (я мог бы получить 0 в v, и я хочу, чтобы уметь отделять v == 0 из недостающих элементов)
DT2 <- DT[, {SUM.<-factor(x); data.table(model.matrix(~ SUM.:v + 0))}]
txtR) DT2
SUM.1:v SUM.2:v SUM.3:v
1: 29 0 0
2: 92 0 0
3: 100 0 0
4: 82 0 0
5: 0 28 0
6: 0 26 0
7: 0 18 0
8: 0 22 0
9: 0 0 30
10: 0 0 96
11: 0 0 15
12: 0 0 4
Я думаю, этого достаточно для 'by = x'? – Arun
Хм, нужный вывод имеет столбец «y» в любом случае. Не помещая его в 'by', мне нужно было бы сделать что-то вроде слияния или' DT [, c (list (y = y), v. = Lapply (1: 3, function (i) v [x == я])), с = "х"] '? – Frank
@Frank, я так думаю. Ваш текущий ответ с 'by =" x, y "' не будет идентичен требованию OP. Посмотрите внимательно на значения, которые вы получаете для своих столбцов, и сравните с моими .. (кроме NA, которые я до сих пор не знаю, как заменить при создании model.matrix). – Arun