在R中使用多个变量和多个指标进行转置

时间:2012-02-28 21:13:48

标签: r transpose

我以前是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 个答案:

答案 0 :(得分: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)]

编辑在查看Brian的评论和变量时,我认为长篇大论的转变是海报所希望的。我可能会使用Wickham的reshape2包来接近它,因为这种方法对我来说更容易使用,我想这对于R初学者也会更容易。但是,这是使用Brian提供的相同数据集进行长到宽格式的基本方法:

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

reshape(wide)

重塑功能非常灵活,但需要一些习惯才能正确使用。虽然我现在认为这不是海报的意图,但我还是要保留这篇文章的历史记录。它提醒您,可重现的示例非常有助于为查询提供清晰度。

答案 1 :(得分:1)

Tyler说,示例数据非常重要。我对您的问题的解释不同,因为我认为您的数据不同。我没有把-作为数字的字面减法,而是变量的组合。

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

列名称之间有一个_而不是-,但您可以根据需要更改它。但是我不建议这样做,因为之后你会在引用列时遇到问题,因为-将被视为减法(你需要引用名称)。