2013-03-24 2 views
4

Я хочу преобразовать свои данные из длинного в широкий формат. Если найти это действительно раздражает, что reshape изменяет метки столбцов, есть ли способ избежать этого?Функция изменения формы R() изменяет метки столбцов

Например, если я бы информацию в длинном формате, как это:

Year Name Value 
1996 a 1 
1997 a 2 
1998 b 3 
1999 b 4 

Я хотел бы использовать reshape() как этот

reshape(long, timevar = "Year", idvar = "Name", direction = "wide") 

Превращение само по себе работает отлично, но имена столбцов будет выглядеть эти:

Name Time.1996 Time.1997 Time.1998 Time.1999 

Единственное, о чем я могу сейчас думать, это переименуйте имена столбцов вручную, что очень раздражает, если вам нужно сделать это для нескольких наборов данных.

+0

См. Коллекцию различных способов сделать это, переделав здесь; возможно, один из них будет лучше соответствовать вашим потребностям: http://stackoverflow.com/a/9617424/210673 – Aaron

ответ

12

Я не вижу вопрос здесь, но если это вас так беспокоит, есть несколько альтернатив.

В базе R вы можете использовать xtabs (много времени) для этого типа преобразования.

as.data.frame.matrix(xtabs(Value ~ Name + Year, long)) 
# 1996 1997 1998 1999 
# a 1 2 0 0 
# b 0 0 3 4 

Или, прибегая к пакетам, вы можете использовать dcast от "reshape2".

library(reshape2) 
dcast(long, Name ~ Year) 
# Using Value as value column: use value.var to override. 
# Name 1996 1997 1998 1999 
# 1 a 1 2 NA NA 
# 2 b NA NA 3 4 

Я согласен, что с одной переменной переформируется таким образом, он может быть раздражающим, чтобы иметь имена изменены так, как они есть. Однако имейте в виду другие типичные варианты использования функции reshape, и вы увидите, что это может быть очень полезно. Например, давайте добавим еще один столбец в «длинные» набор данных, а затем изменить форму:

> long$Something <- 5:8 
> reshape(long, timevar = "Year", idvar = "Name", direction = "wide") 
    Name Value.1996 Something.1996 Value.1997 Something.1997 Value.1998 
1 a   1    5   2    6   NA 
3 b   NA    NA   NA    NA   3 
    Something.1998 Value.1999 Something.1999 
1    NA   NA    NA 
3    7   4    8 

без сохранения имени столбца, будучи видоизмененным, вы не знаете, какое 1996 для «Value» и который для «Что-то».


Наконец, если вы хотите использовать reshape (который я, случается, нравится), и фактические данные точно отражены в этом примере (только один столбец, который должен быть «повернута» один или более столбцов), вот еще два варианта:

Использование setNames. Легко предсказать, какими должны быть имена: вектор переменных вашего идентификатора, за которым следует переменная времени.

> setNames(reshape(long, timevar = "Year", idvar = "Name", direction = "wide"), 
+   c("Name", long$Year)) 
    Name 1996 1997 1998 1999 
1 a 1 2 NA NA 
3 b NA NA 3 4 

Использование sub или gsub для редактирования имен переменных.Опять же, поскольку мы знаем, что у нас есть только одна переменная, которая была повернута, легко предсказать изменение, которое нужно сделать.

> wide <- reshape(long, timevar = "Year", idvar = "Name", direction = "wide") 
> names(wide) 
[1] "Name"  "Value.1996" "Value.1997" "Value.1998" "Value.1999" 
> names(wide) <- gsub("Value.", "", names(wide)) 
> wide 
    Name 1996 1997 1998 1999 
1 a 1 2 NA NA 
3 b NA NA 3 4 
+0

Спасибо, 'xtabs()' отлично работает для меня и делает именно то, что я хотел! – 2013-03-24 19:17:36