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