2016-06-13 2 views
1

Мне нравится переформатировать набор данных от длинного до широкого. В частности, новый широкий набор данных должен состоять из строк, соответствующих уникальному количеству идентификаторов в длинном наборе данных, а количество столбцов кратно уникальным значениям другой переменной.R Частичная переформатировка данных от длинного до широкого

Допустим, это оригинальный набор данных:

ID a b C d e f g 
1 1 1 1 1 2 3 4 
1 1 1 2 5 6 7 8 
2 2 2 1 1 2 3 4 
2 2 2 3 9 0 1 2 
2 2 2 2 5 6 7 8 
3 3 3 3 9 0 1 2 
3 3 3 2 5 6 7 8 
3 3 3 1 1 2 3 4 

В новом наборе данных, количество строк, это число идентификаторов, число столбцов равно 3 плюс кратное уникальных элементов найдены в переменной C и значения от переменных d до g заселяются после сортировки переменной C в порядке возрастания. Это должно выглядеть примерно так:

ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 

ответ

3

Вы можете использовать dcast из data.table:

data.table::setDT(df) 
data.table::dcast(df, ID + a + b ~ C, sep = "", value.var = c("d", "e", "f", "g"), fill=NA) 

    ID a b d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 
1: 1 1 1 1 5 NA 2 6 NA 3 7 NA 4 8 NA 
2: 2 2 2 1 5 9 2 6 0 3 7 1 4 8 2 
3: 3 3 3 1 5 9 2 6 0 3 7 1 4 8 2 
+1

Есть ли способ заполнить данные в соответствии с значениями в переменной 'C' в порядке возрастания? Эта часть была опущена. –

+0

Не видел прямого способа сделать это, но вы можете сортировать имена столбцов по цифре. Например: 'c (имена (dt) [1: 3], имена (dt) [3:15] [порядок (str_extract (имена (dt) [3:15]," \\ d + ")))) [1] "ID" "a" "b" "d1" "e1" "f1" "g1" "d2" "e2" "f2" "g2" "d3" "e3" "f3" "g3" "b "", а затем выберите столбцы в этом порядке. – Psidom

3

Base reshape версии - просто использовать C в качестве переменного времени и прочь вы идете.

reshape(dat, idvar=c("ID","a","b"), direction="wide", timevar="C", sep="") 
# ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
#1 1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
#3 2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
#6 3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 
Смежные вопросы