2017-02-03 2 views
-1

Как я могу изменить таблицу данных по id, чтобы столбцы внутри одного и того же идентификатора были установлены рядом друг с другом? Следующий код в виде короткого примера ввода и желаемого выходаПереупорядочить DT по id, чтобы все разные значения помещались в столбцы друг рядом друг с другом

require(data.table) 
set.seed(456) 
DT <- data.table(id = c(1,1,1, 2,2, 3,3, 4,4,4, 5), 
       X = round(runif(11, 0, 1),2), 
       Y = round(runif(11, 5, 10)), 
       A = c(rep(9, 3), rep(10, 2), rep(11, 2), rep(12, 3), 13)) 

Input

DT 
# id X Y A 
# 1: 1 0.09 6 9 
# 2: 1 0.21 9 9 
# 3: 1 0.73 9 9 
# 4: 2 0.85 8 10 
# 5: 2 0.79 8 10 
# 6: 3 0.33 9 11 
# 7: 3 0.08 7 11 
# 8: 4 0.29 9 12 
# 9: 4 0.24 6 12 
# 10: 4 0.39 6 12 
# 11: 5 0.37 9 13 
# ... 

Я хочу что-то вроде этого: для каждого подмножества по ID: После того как все постоянные переменные (в пределах каждого id, здесь: A и id), поместите все разные переменные (внутри каждого идентификатора здесь: X- и Y-столбцы) в той же строке, создав новые столбцы (X -> X1, X2, X3, Y -> Y1, Y2, Y3) Вхождения по id различны и меняются в моем случае между 1 и 3, поэтому e отсутствующие значения для всех идентификаторов с вхождениями менее 3 должны быть заполнены NA.

Желаемая выход

# id A X1 Y1 X2 Y2 X3 Y3 
# 1 9 0.09 6 0.21 9 0.73 9 
# 2 10 0.85 8 0.79 8 NA NA 
# 3 11 0.33 9 0.08 7 NA NA 
# 4 12 0.29 9 0.24 6 0.39 6 
# 5 13 0.37 9 NA NA NA NA 
# ... 

Легко получить количество элементов в каждой подгруппе с DT[,.N, by = id], но я борюсь со следующими шагами. Конечно, количество столбцов и строк намного больше, поэтому я бы предпочел решения с меньшим количеством имен столбцов (но, конечно, где-то нужно определить константу и разные столбцы).

+1

Ну, решение моего дубликата, по той причине, что я никогда бы не найти его, не зная, '' dcast'' исключение. – Phann

+1

@Jaap Я думаю, что OP также попросил переупорядочить столбцы, в этом случае это было бы затруднительно из ссылки, которую вы обманули. – akrun

+1

И еще одна разница между столбцом '' A'' (константа) рядом с '' id''. – Phann

ответ

2

Мы можем использовать dcast

library(data.table) 
res <- dcast(DT, id~rowid(id), value.var = c("X", "Y", "A")) 
res[, c("id", names(res)[-1][order(sub("\\D+", "", names(res)[-1]))]), with = FALSE] 
+0

Очень приятное решение! Я получаю oppinion, что с '' data.table'' каждая проблема должна быть решена в 2 строках .... Однако у меня есть усовершенствование вашего решения, чтобы лучше соответствовать моему желаемому результату: '' dcast (DT, id + A ~ rowid (id), value.var = c ("X", "Y")) '' и следовательно : '' res [, c ("id", "A", names (res) [- c (1,2)] [order (sub ("\\ D +", "", names (res) [- c (1,2)]))]), with = FALSE] '' – Phann

+0

@Phann Спасибо за комментарии. – akrun