将两个变量重新编码为一个新变量

时间:2014-09-20 03:02:37

标签: r variables

我正在尝试创建一个名为“期间”的会计年度变量,该变量将从9月到8月持续6年。我的数据框“dat”的结构如下:

'data.frame':   52966 obs. of  4 variables:
 $ userid       : int  96 96 96 101 101 101 101 101 101 101 ...
 $ comment.year : int  2008 2009 2009 2008 2008 2008 2008 2008 2008 2009 ...
 $ comment.month: int  7 3 8 7 8 9 10 11 12 1 ...
 $ num.comments : int  1 1 1 33 51 16 27 29 40 39 ...

我收到此错误消息:错误:“dat $ period [comment.year = 2008& comment.month =”中的意外'=' 当我运行以下代码时。我已尝试使用双等号并将月份和年份整数用引号括起来,但没有成功。我也想知道是否有更简单的方法来进行重新编码。由于我处理了6年,我的方法需要72行。

dat$period[comment.year=2008 & comment.month=9]<-"1"     
dat$period[comment.year=2008 & comment.month=10]<-"1"                 
dat$period[comment.year=2008 & comment.month=11]<-"1" 
dat$period[comment.year=2008 & comment.month=12]<-"1"
dat$period[comment.year=2009 & comment.month=1]<-"1"
dat$period[comment.year=2009 & comment.month=2]<-"1"
dat$period[comment.year=2009 & comment.month=3]<-"1"
dat$period[comment.year=2009 & comment.month=4]<-"1"
dat$period[comment.year=2009 & comment.month=5]<-"1"
dat$period[comment.year=2009 & comment.month=6]<-"1"
dat$period[comment.year=2009 & comment.month=7]<-"1"
dat$period[comment.year=2009 & comment.month=8]<-"1"
dat$period[comment.year=2009 & comment.month=9]<-"2"
dat$period[comment.year=2009 & comment.month=10]<-"2"                     
dat$period[comment.year=2009 & comment.month=11]<-"2" 
dat$period[comment.year=2009 & comment.month=12]<-"2"

3 个答案:

答案 0 :(得分:2)

为什么不只是计算几个月内的奖励数量不同的年份&gt; = 9?

#sample data
dat<-data.frame(
    comment.year=rep(2009:2011, each=12), 
    comment.month=rep(1:12, 3)
)[-(1:8), ]

#assign new period
dat$period<- dat$comment.year-min(dat$comment.year) + ifelse(dat$comment.month>=9,1,0)

给你

   comment.year comment.month period
9          2009             9      1
10         2009            10      1
11         2009            11      1
12         2009            12      1
13         2010             1      1
14         2010             2      1
15         2010             3      1
16         2010             4      1
17         2010             5      1
18         2010             6      1
19         2010             7      1
20         2010             8      1
21         2010             9      2
22         2010            10      2
23         2010            11      2
24         2010            12      2
25         2011             1      2
26         2011             2      2
27         2011             3      2
28         2011             4      2
29         2011             5      2
30         2011             6      2
31         2011             7      2
32         2011             8      2
33         2011             9      3
34         2011            10      3
35         2011            11      3
36         2011            12      3

如果您想确保从特定用户开始,可以使用2009而不是min(dat$comment.year)

答案 1 :(得分:0)

使用MrFlick的样本数据:

dat$period = rep(1:3, each=12)[1:28]
dat
   comment.year comment.month period
9          2009             9      1
10         2009            10      1
11         2009            11      1
12         2009            12      1
13         2010             1      1
14         2010             2      1
15         2010             3      1
16         2010             4      1
17         2010             5      1
18         2010             6      1
19         2010             7      1
20         2010             8      1
21         2010             9      2
22         2010            10      2
23         2010            11      2
24         2010            12      2
25         2011             1      2
26         2011             2      2
27         2011             3      2
28         2011             4      2
29         2011             5      2
30         2011             6      2
31         2011             7      2
32         2011             8      2
33         2011             9      3
34         2011            10      3
35         2011            11      3
36         2011            12      3
> 

可以轻松扩展到您的数据。

答案 2 :(得分:0)

我猜你也可以试试(使用@ MrFlick的数据)

set.seed(42)
dat1 <- dat[sample(1:nrow(dat)),]
dat<- within(dat, {period<- as.numeric(factor(comment.year))
              period[comment.month <9] <- period[comment.month <9] -1})

 dat
 #        comment.year comment.month period
 #9          2009             9      1
 #10         2009            10      1
 #11         2009            11      1
 #12         2009            12      1
 #13         2010             1      1
 #14         2010             2      1
 #15         2010             3      1
 #16         2010             4      1
 #17         2010             5      1
 #18         2010             6      1
 #19         2010             7      1
 #20         2010             8      1
 #21         2010             9      2
 #22         2010            10      2
 #23         2010            11      2
 #24         2010            12      2
 #25         2011             1      2
 #26         2011             2      2
 #27         2011             3      2
 #28         2011             4      2
 #29         2011             5      2
 #30         2011             6      2
 #31         2011             7      2
 #32         2011             8      2
 #33         2011             9      3
 #34         2011            10      3
 #35         2011            11      3
 #36         2011            12      3

使用无序的dat1

 within(dat1, {period<- as.numeric(factor(comment.year)); period[comment.month <9] <- period[comment.month <9] -1})[,3]
 #[1] 3 3 1 2 2 1 2 1 2 2 1 2 2 1 1 2 2 1 1 1 3 1 2 1 2 1 2 3

使用@ MrFlick的方法交叉检查结果

 dat1$comment.year-min(dat1$comment.year) + ifelse(dat1$comment.month>=9,1,0)
 # [1] 3 3 1 2 2 1 2 1 2 2 1 2 2 1 1 2 2 1 1 1 3 1 2 1 2 1 2 3