2012-02-28 6 views
1

Я уже являюсь пользователем SAS - поскольку у меня больше нет SAS, мне нужно научиться использовать R для работы. Набор данных имеет следующий столбец:Транспонирование с несколькими переменными и несколькими метриками в R

market date sitename impression clicks 

Я хочу перенести его в:

market date sitename-impression sitename-clicks 

Я думаю, что в SAS я делал:

Proc Transpose 
by market date; 
id sitename; 
var impression clicks; 
run; 

У меня есть книга на R и googled много, но не смог найти решение, которое работает ...

Действительно оценил бы i Любой может помочь.

Заранее благодарен!

+0

Вы ищете 'reshape' или что-то вроде' cast' или 'melt' из пакета' reshape'. Я не знаком с SAS, поэтому я не уверен, какой результат функции вы дали. Можете ли вы предоставить небольшой образец входных данных и желаемый результат? – Justin

+0

О, может быть, плакат хочет идти от широкого до длинного. Если это так, пренебрегайте моим ответом. –

+0

@Justin Глядя на имена переменных, ваше предложение имеет наибольший смысл, но я держусь за редактирование своего ответа, пока плакат не предоставит набор данных того, что у них есть и что они ожидают (или представление данных, которые у них есть) –

ответ

4

Позвольте мне начать с приветствия stackoverflow. Рад иметь нового пользователя. Когда вы задаете вопрос, это полезно и рекомендуется для вас предоставить код, который вы используете, и воспроизводимый набор данных, который выглядит как оригинал. Это называется минимальным воспроизводимым примером. Чтобы получить набор данных здесь, вы можете использовать несколько параметров, вот два: используйте dput() вокруг имени объекта и вырежьте и вставьте то, что отображается в консоли, или просто отправьте данные. Для кода укажите весь код, необходимый для репликации вашей проблемы. Надеюсь, вы найдете это полезным для будущих вопросов, которые вы зададите.

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

dat <- data.frame(market=rnorm(10), date=rnorm(10), #let's create a data set 
    sitename=rnorm(10), impression=rnorm(10), clicks=rnorm(10)) 
dat #look at it (I pasted it below) 

# > dat              
#   market  date sitename impression  clicks 
# 1 -0.9593797 -0.08411994 1.6079129 -0.5204772 -0.31633966 
# 2 -0.5088689 1.78799500 -0.2469315 1.3476964 -0.04344779 
# 3 -0.1527465 0.81673996 1.7824969 -1.5531260 -1.28304384 
# 4 -0.7026194 0.52072913 -0.1174356 0.5722210 -1.20474443 
# 5 -0.4537490 -0.69139062 1.1124277 -0.2452974 -0.33025320 
# 6 0.7466588 0.36318337 -0.4623319 -0.9036768 -0.65754302 
# 7 0.8007612 2.59588554 0.1820732 0.4318629 -0.36308748 
# 8 1.0781715 -1.01512734 0.2297475 0.9219439 -1.15687902 
# 9 0.3731450 -0.19004572 0.5190749 -1.4020371 -0.97370295 
# 10 0.7724259 1.76528303 0.5781786 -0.5490849 -0.83819036 

#now to create the new columns (I think this is what you want) 
#the easiest way is to use transform. ?tranform for more   
dat.new <- transform(dat, sitename.clicks=sitename-clicks, 
    impression.clicks=impression-clicks) 
dat.new #here's the new data set. Notice it has the new and old columns. 

#To get rid of the old columns you can use indexing and specify the columns you want. 
dat.new[, c(1:2, 6:7)] 

#We could have also done: 
dat.new[, c(1,2,6,7)] 
#or said the columns not wanted with negative indexing: 
dat.new[, -c(3:5)] 

EDIT Глядя на комментарии Брайана и переменных я думаю, что долго широкой трансформации, что стендовые желания. Я, скорее всего, подойду к нему, используя пакет reshape2 от Wickham, так как этот метод мне легче работать, и я думаю, что для новичков R было бы легче. Тем не менее, здесь является базовым способом сделать длинный в широком формате, используя одни и те же набор данных Brian при условии:

wide <- reshape(DF, v.names=c("impression", "clicks"), idvar=c("market", "date"), 
timevar="sitename", direction="wide") 

reshape(wide) 

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

1

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

DF <- expand.grid(market = LETTERS[1:5], 
        date = Sys.Date()+(0:5), 
        sitename = letters[1:2]) 
n <- nrow(DF) 
DF$impression <- sample(100, n, replace=TRUE) 
DF$clicks <- sample(100, n, replace=TRUE) 

Я нахожу reshape2 пакет полезным для этого рода транспозиция/преобразования/перестроек.

library("reshape2") 

dcast(melt(DF, id.vars=c("market","date","sitename")), 
     market+date~sitename+variable) 

дает

market  date a_impression a_clicks b_impression b_clicks 
1  A 2012-02-28   74  97   11  71 
2  A 2012-02-29   34  30   88  35 
3  A 2012-03-01   40  85   40  49 
4  A 2012-03-02   46  12   99  20 
5  A 2012-03-03   6  95   85  56 
6  A 2012-03-04   61  61   42  64 
7  B 2012-02-28   4  53   74  9 
8  B 2012-02-29   43  27   92  59 
9  B 2012-03-01   34  26   86  43 
10  B 2012-03-02   81  47   84  35 
11  B 2012-03-03   3  5   91  48 
12  B 2012-03-04   19  26   99  21 
13  C 2012-02-28   22  31   100  53 
14  C 2012-02-29   40  83   95  27 
15  C 2012-03-01   78  89   81  29 
16  C 2012-03-02   57  55   79  87 
17  C 2012-03-03   37  61   3  97 
18  C 2012-03-04   83  61   41  77 
19  D 2012-02-28   81  18   47  3 
20  D 2012-02-29   90  100   17  83 
21  D 2012-03-01   12  40   35  93 
22  D 2012-03-02   85  14   63  67 
23  D 2012-03-03   63  53   29  58 
24  D 2012-03-04   40  79   56  70 
25  E 2012-02-28   97  62   68  31 
26  E 2012-02-29   24  84   17  63 
27  E 2012-03-01   94  93   32  2 
28  E 2012-03-02   6  26   86  26 
29  E 2012-03-03   100  34   37  80 
30  E 2012-03-04   89  87   72  11 

Имена столбцов имеют _ между ними, а не -, но вы можете изменить это, если вы хотите.Я бы не рекомендовал его, потому что тогда у вас будут проблемы позже, ссылаясь на столбец, так как - будет считаться вычитанием (вам нужно будет указать его название).