2016-01-24 2 views
1

У меня есть набор данных в «длинном» формате, который я хочу изменить в «широком» формате. Я хочу группировать по множеству столбцов и группировать оставшиеся столбцы в соответствующие пары. Я думаю, что знаю, как долго развиваться, когда только один столбец «расширяется», но я не могу заставить его работать, когда мне нужно многократно расширять одновременно.Long to Wide - перевод нескольких столбцов в несколько новых столбцов (2 >> 6)

Ознакомьтесь с примерами для нужной начальной и конечной точки.

ЗАПУСК:

structure(list(gender = structure(c(2L, 2L, 2L, 1L, 1L, 1L, 2L 
    ), .Label = c("female", "male"), class = "factor"), state =  structure(c(3L, 
    3L, 3L, 1L, 1L, 1L, 2L), .Label = c("ca", "ny", "tx"), class = "factor"), 
name = structure(c(3L, 5L, 7L, 6L, 1L, 2L, 4L), .Label = c("ashley", 
"jackie", "john", "luke", "mark", "mary", "rob"), class = "factor"), 
value = c(1L, 2L, 3L, 1L, 2L, 3L, 1L)), .Names = c("gender", 
"state", "name", "value"), class = "data.frame", row.names = c(NA, 
-7L)) 

ЗАВЕРШЕНИЕ:

structure(list(gender = structure(c(2L, 1L, 2L), .Label = c("female", 
"male"), class = "factor"), state = structure(c(3L, 1L, 2L), .Label = c("ca", 
"ny", "tx"), class = "factor"), value1 = c(1L, 1L, 1L), name1 = structure(c(1L, 
3L, 2L), .Label = c("john", "luke", "mary"), class = "factor"), 
value2 = c(2L, 2L, NA), name2 = structure(c(2L, 1L, NA), .Label = c("ashley", 
"mark"), class = "factor"), value3 = c(3L, 3L, NA), name3 = structure(c(2L, 
1L, NA), .Label = c("jackie", "rob"), class = "factor")), .Names = c("gender", 
"state", "value1", "name1", "value2", "name2", "value3", "name3" 
), class = "data.frame", row.names = c(NA, -3L)) 

ответ

1

Мы можем использовать dcast из data.table, который может принимать несколько столбцов 'value.var'. Мы преобразуем data.frame в data.table (setDT(df1)), создадим столбец последовательностей («N»), сгруппированный по «пол» и «состояние». Затем используйте dcast для преобразования из формата 'long' в 'wide'.

library(data.table) 
setDT(df1)[, N:= 1:.N, .(gender,state)] 
dcast(df1, gender+state~N, value.var=c("name", "value"), sep="") 
# gender state name1 name2 name3 value1 value2 value3 
#1: female ca mary ashley jackie  1  2  3 
#2: male ny luke  NA  NA  1  NA  NA 
#3: male tx john mark rob  1  2  3 

Это может быть также сделано с reshape из base R после создания столбца последовательности

dfN <- transform(df1, N = ave(seq_along(state), 
         gender, state, FUN=seq_along)) 
reshape(dfN, idvar=c('gender', 'state'), timevar= 'N', 
       direction='wide') 
# gender state name.1 value.1 name.2 value.2 name.3 value.3 
#1 male tx john  1 mark  2 rob  3 
#4 female ca mary  1 ashley  2 jackie  3 
#7 male ny luke  1 <NA>  NA <NA>  NA 
+1

удивительного, не смог найти какие-либо примеров о том, как это сделать или понять это с несколькими колонка, длинная >> широкая. благодаря!!!!!!!!! – runningbirds

 Смежные вопросы

  • Нет связанных вопросов^_^