Транспонировать с несколькими переменными и более чем одной метрикой в ​​R - PullRequest
1 голос
/ 29 февраля 2012

Ранее я был пользователем SAS - поскольку у меня больше нет SAS, мне нужно научиться использовать 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 и я много гуглил, но не смог найти решение, которое работает ...

Буду очень признателен, если кто-нибудь сможет помочь.

Заранее спасибо !!!

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Позвольте мне начать с приветствия 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)]

РЕДАКТИРОВАТЬ Рассматривая комментарии Брайана и переменные, я бы подумал, что трансформация в длинную и широкую - это то, чего желает плакат. Я, вероятно, подхожу к нему, используя пакет reshape2 от Wickham, так как с этим методом мне легче работать, и я думаю, что он будет проще и для новичка в R. Однако вот базовый способ сделать длинный и широкий формат, используя тот же набор данных, который предоставил Брайан:

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

reshape(wide)

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

1 голос
/ 29 февраля 2012

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

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

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

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