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

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

于 2012-02-29T00:03:28.317 回答