我有一个数据框如下:
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 == 12
到year + 1
吗?
非常感谢任何帮助。
答案 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)