定义条件

时间:2018-02-23 18:40:16

标签: r

我有一个数据框如下:

ID Mois Year
A   12   2010
B   01   2011
C   04   2010
D   05   2011
E   07   2011
F   11    2010
G   12    2011
H   03    2010
I   01    2012
J   02    2012

我想将季度列添加为:

  

quarter1:(12(n-1),n为01,n为02):表示(2010年第12期,第1期)   2011年,2011年第02期)

     

第2季:(n的03,n的04,n的05)

     

第3季:( n的06,n的O7,n的O8)

     

quarter4 :( 09的n,10,n,11   n)

我试过这段代码`

data=cbind(data, quarter=ifelse(data$mois==c(12,1,2), "1",
                            ifelse(data$mois==c(3,4,5),"2",
                                   ifelse(data$mois==c(6,7,8),"3", "4"))))

但它不起作用,我不知道如何将quarter1的条件添加为(12(n-1),n为01,n为02):表示(2010年第12期,2011年第1期,02 2011年)

或者我可以在执行季度之前将data$year替换为data$month == 12year + 1吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

1)公式我们可以使用此公式计算季度:

transform(data, YearQ = Year + (Mois == 12), Quarter = Mois %% 12 %/% 3 + 1)

,并提供:

   ID Mois Year YearQ Quarter
1   A   12 2010  2011       1
2   B    1 2011  2011       1
3   C    4 2010  2010       2
4   D    5 2011  2011       2
5   E    7 2011  2011       3
6   F   11 2010  2010       4
7   G   12 2011  2012       1
8   H    3 2010  2010       2
9   I    1 2012  2012       1
10  J    2 2012  2012       1

2)yearqtr 另一种可能性是使用"yearqtr"类给出相同的结果:

library(zoo)

transform(data, YearQ = Year + (Mois == 12), Quarter = cycle(as.yearqtr(Year + Mois/12)))

与(1)相同。

2a)或者,我们可能只想创建yearmon和yearqtr列:

transform(data, ym = as.yearmon(Year + (Mois -1)/12), yq = as.yearqtr(Year + Mois/12))

,并提供:

   ID Mois Year       ym      yq
1   A   12 2010 Dec 2010 2011 Q1
2   B    1 2011 Jan 2011 2011 Q1
3   C    4 2010 Apr 2010 2010 Q2
4   D    5 2011 May 2011 2011 Q2
5   E    7 2011 Jul 2011 2011 Q3
6   F   11 2010 Nov 2010 2010 Q4
7   G   12 2011 Dec 2011 2012 Q1
8   H    3 2010 Mar 2010 2010 Q2
9   I    1 2012 Jan 2012 2012 Q1
10  J    2 2012 Feb 2012 2012 Q1

3)切换我们可以像这样使用switch

transform(data, YearQ = Year + (Mois == 12), 
                Quarter = sapply(Mois, switch, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1)))

与(1)相同。

注意

可重现形式的输入data是:

Lines <- "
ID Mois Year
A   12   2010
B   01   2011
C   04   2010
D   05   2011
E   07   2011
F   11    2010
G   12    2011
H   03    2010
I   01    2012
J   02    2012"
data <- read.table(text = Lines, header = TRUE)

答案 1 :(得分:3)

如果您可以使用课程quarter的新专栏factor,则cut会执行此操作。

m <- data$Mois
m[m == 12] <- 0
data$quarter <- cut(m, breaks = c(-1, 2, 5, 8, 11), labels = as.character(1:4))
rm(m)    # tidy up

如果你真的需要或想要上课character,那就强迫它吧。

data$quarter <- as.character(data$quarter)

DATA。

dput(data)
structure(list(ID = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), Mois = c(12L, 
1L, 4L, 5L, 7L, 11L, 12L, 3L, 1L, 2L), Year = c(2010L, 2011L, 
2010L, 2011L, 2011L, 2010L, 2011L, 2010L, 2012L, 2012L)), .Names = c("ID", 
"Mois", "Year"), class = "data.frame", row.names = c(NA, -10L
))

答案 2 :(得分:2)

另一种选择可能是使用与OP相同的解决方案。使用quarter添加ifelse列,然后使用year修改ifelse

data$quarter <- ifelse(data$Mois %in% c(12,1,2), "1",
                       ifelse(data$Mois %in% c(3,4,5),"2",
                              ifelse(data$Mois %in% c(6,7,8),"3", "4")))

data$Year <- ifelse(data$Mois == 12, data$Year + 1, data$Year)

data
   ID Mois Year quarter
1   A   12 2011       1
2   B    1 2011       1
3   C    4 2010       2
4   D    5 2011       2
5   E    7 2011       3
6   F   11 2010       4
7   G   12 2012       1
8   H    3 2010       2
9   I    1 2012       1
10  J    2 2012       1

数据:

data <- read.table(text = "ID Mois Year
A   12   2010
B   01   2011
C   04   2010
D   05   2011
E   07   2011
F   11    2010
G   12    2011
H   03    2010
I   01    2012
J   02    2012", header = TRUE, stringsAsFactor = FALSE)