Как повернуть таблицу, чтобы сделать столбцы для переменных значений строк в R - PullRequest
5 голосов
/ 24 июня 2011

У меня есть data.frame со столбцами: Month, Store и Demand.

Month   Store   Demand
Jan     A   100
Feb     A   150
Mar     A   120
Jan     B   200
Feb     B   230
Mar     B   320

Мне нужно развернуть его, чтобы создать новый data.frame или массив со столбцами для каждого месяца, сохранитьНапример:

Store   Jan Feb Mar
A       100 150 120
B       200 230 320

Любая помощь очень ценится.Я только начал с R.

Ответы [ 3 ]

9 голосов
/ 24 июня 2011
> df <- read.table(textConnection("Month   Store   Demand
+ Jan     A   100
+ Feb     A   150
+ Mar     A   120
+ Jan     B   200
+ Feb     B   230
+ Mar     B   320"), header=TRUE)

Так что, по всей вероятности, ваш столбец Month является фактором с уровнями, отсортированными по алфавиту (EDIT:)

> df$Month <- factor(df$Month, levels= month.abb[1:3])
 # Just changing levels was not correct way to handle the problem. 
 # Need to use within a factor(...) call.
> xtabs(Demand ~ Store+Month, df)
      Month
 Store Jan Feb Mar
     A 100 150 120
     B 200 230 320

Немного менее очевидный метод (поскольку функция 'I' возвращает свой аргумент):

> with(df, tapply(Demand, list(Store, Month) , I)  )
  Jan Feb Mar
A 100 150 120
B 200 230 320
5 голосов
/ 24 июня 2011

Добро пожаловать в R.

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

# create the data as explained by @Dwin
df <- read.table(textConnection("Month   Store   Demand
                                Jan     A   100
                                Feb     A   150
                                Mar     A   120
                                Jan     B   200
                                Feb     B   230
                                Mar     B   320"), 
                 header=TRUE)

# load the reshape package from Hadley -- he has created GREAT packages
library(reshape)

# reshape the data from long to wide
cast(df, Store ~ Month)

И для справки, вы должны проверить этот замечательный учебник.http://www.jstatsoft.org/v21/i12/paper

4 голосов
/ 25 июня 2011

Если данные находятся в dat (и уровни установлены в календарном порядке), то другое базовое решение R - использовать (невероятно не интуитивно понятную) функцию reshape():

reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
        direction = "wide")

, который для фрагмента данных дает:

> reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
+         direction = "wide")
  Store Demand.Jan Demand.Feb Demand.Mar
1     A        100        150        120
4     B        200        230        320

Имена можно легко очистить, если вы хотите:

> out <- reshape(dat, v.names = "Demand", idvar = "Store", timevar = "Month", 
+                direction = "wide")
> names(out)[-1] <- month.abb[1:3]
> out
  Store Jan Feb Mar
1     A 100 150 120
4     B 200 230 320

(Чтобы получить вывод выше, я прочитал данные аналогично тому, как показано в ответе @ DWin, а затем выполнил следующее:

dat <- transform(dat, Month = factor(Month, levels = month.abb[1:3]))

где dat было то, что я назвал данными)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...