1

私は以前は 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に関する本を持っていて、たくさんグーグルで検索しましたが、うまくいく解決策を見つけることができませんでした...

誰かが助けてくれれば本当に感謝します。

前もって感謝します!!!

4

2 に答える 2

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)]

編集ブライアンのコメントと変数を見ると、長いものから広いものへの変換がポスターが望んでいるものだと思います。Wickham の reshape2 パッケージも使用してアプローチする可能性があります。この方法は私にとって作業が簡単で、R の初心者にとっても簡単だと思います。ただし、Brian が提供した同じデータ セットを使用して、ロング フォーマットからワイド フォーマットへ変換する基本的な方法を次に示します。

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

reshape(wide)

reshape 関数は非常に柔軟ですが、適切に使用するには慣れが必要です。この投稿の履歴を保持するために、以前の応答も残しておきますが、これは投稿者の意図ではないと今は信じています. 再現可能な例は、クエリを明確にするのに非常に役立つことを思い出してください。

于 2012-02-28T21:57:03.917 に答える
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

列名の_間には ではなく-がありますが、必要に応じて変更できます。ただし、これはお勧めしません。これは、後で列を参照するときに問題が発生するため-です。

于 2012-02-29T00:03:28.317 に答える