2015-07-06 4 views
3

В пакете «Введение в reshape2» Шон К. Андерсон представляет следующий пример.dcast без идентификационных переменных

Он использует данные Качество воздуха и переименовывает имена столбцов

names(airquality) <- tolower(names(airquality)) 

Данные выглядят как

# ozone solar.r wind temp month day 
# 1 41  190 7.4 67  5 1 
# 2 36  118 8.0 72  5 2 
# 3 12  149 12.6 74  5 3 
# 4 18  313 11.5 62  5 4 
# 5 NA  NA 14.3 56  5 5 
# 6 28  NA 14.9 66  5 6 

Затем он расплавов их

aql <- melt(airquality, id.vars = c("month", "day")) 

получить

# month day variable value 
# 1  5 1 ozone 41 
# 2  5 2 ozone 36 
# 3  5 3 ozone 12 
# 4  5 4 ozone 18 
# 5  5 5 ozone NA 
# 6  5 6 ozone 28 

Наконец, он получает оригинал один (другой порядок столбец) по

aqw <- dcast(aql, month + day ~ variable) 

Мой Quesiton

Предположим теперь, что мы не имеем ID переменные (т.е. месяц и день) и расплавились данные следующим образом

aql <- melt(airquality) 

которые выглядят как

# variable value 
# 1 ozone 41 
# 2 ozone 36 
# 3 ozone 12 
# 4 ozone 18 
# 5 ozone NA 
# 6 ozone 28 

Мой вопрос, как я могу получить оригинальные из них? Оригинальные из них будут соответствовать

# ozone solar.r wind temp 
# 1 41  190 7.4 67 
# 2 36  118 8.0 72 
# 3 12  149 12.6 74 
# 4 18  313 11.5 62 
# 5 NA  NA 14.3 56 
# 6 28  NA 14.9 66 
+1

Вы не должны редактировать «решения» в свой первоначальный вопрос. Если у вас есть другое/лучшее решение, вы должны добавить свой ответ ниже. В противном случае, просто примите тот, который вы считаете лучшим. – MrFlick

+1

Если вы используете data.table, учебное пособие по его средствам перестройки находится здесь: https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reshape.html В этом вопросе нигде не упоминается data.table отдельно из бирка, хотя ... – Frank

ответ

6

Другой ö ption является unstack

out <- unstack(aql,value~variable) 
head(out) 
# ozone solar.r wind temp month day 
#1 41  190 7.4 67  5 1 
#2 36  118 8.0 72  5 2 
#3 12  149 12.6 74  5 3 
#4 18  313 11.5 62  5 4 
#5 NA  NA 14.3 56  5 5 
#6 28  NA 14.9 66  5 6 

Поскольку речь идет о dcast, мы можем создать столбец последовательности, а затем использовать dcast

aql$indx <- with(aql, ave(seq_along(variable), variable, FUN=seq_along)) 
out1 <- dcast(aql, indx~variable, value.var='value')[,-1] 
head(out1) 
# ozone solar.r wind temp month day 
#1 41  190 7.4 67  5 1 
#2 36  118 8.0 72  5 2 
#3 12  149 12.6 74  5 3 
#4 18  313 11.5 62  5 4 
#5 NA  NA 14.3 56  5 5 
#6 28  NA 14.9 66  5 6 

Если вы используете data.table, версию Devel из data.table т. v1.9.5 также есть dcast функция. Инструкции по установке версии devel: here

library(data.table)#v1.9.5+ 
setDT(aql)[, indx:=1:.N, variable] 
dcast(aql, indx~variable, value.var='value')[,-1] 
+1

очень хорошо !! .... – jenesaisquoi

+0

спасибо !! Я хотел использовать его в объекте data.table (см. Обновление вверх) – conighion

+0

@conighion Обновлено сообщение с параметром data.table. Обязательно установите версию devel. – akrun

2

Один из вариантов с помощью split,

out <- data.frame(sapply(split(aql, aql$variable), `[[`, 2)) 

Здесь, данные разделены на variable колонке, а затем второй столбец каждой группы объединяют обратно в кадр данных, (The [[ функция с аргументом 2 передается sapply)

head(out) 
# Ozone Solar.R Wind Temp Month Day 
# 1 41  190 7.4 67  5 1 
# 2 36  118 8.0 72  5 2 
# 3 12  149 12.6 74  5 3 
# 4 18  313 11.5 62  5 4 
# 5 NA  NA 14.3 56  5 5 
# 6 28  NA 14.9 66  5 6 
Смежные вопросы