将月份“因素”分类为data.frame

时间:2016-12-03 10:21:54

标签: r if-statement time recode

更新(下面的初始问题)

感谢@akrun@ulfelder我意识到我最初的例子并不复杂,因为我只有一年。覆盖数年的数据可能更为现实,对其他人更有用。

相反,我的数据是,

df <- structure(list(yr_month = structure(1:7, .Label = c("2014-1", "2014-2", 
"2014-3", "2015-4", "2016-4", "2016-6", "2017-7"), class = "factor"), 
    a = c(4.14, 2.83, 3.71, 4.15, 4.63, 4.91, 5.31), b = c(4.25, 
    3.5, 3.5, 3.5, 3.5, 3.5, 5)), .Names = c("yrQ", "a", "b"
), row.names = c(NA, 7L), class = "data.frame")
df
#      yrQ    a    b
# 1 2014-1 4.14 4.25
# 2 2014-2 2.83 3.50
# 3 2014-3 3.71 3.50
# 4 2015-4 4.15 3.50
# 5 2016-4 4.63 3.50
# 6 2016-6 4.91 3.50
# 7 2017-7 5.31 5.00

我想在2014年3月,2014年3月之前,2014年3月和2016年4月之间以及2016年4月之后创建一个类别。所以我得到了这样的东西,

#   yr.cat    yrQ    a    b
# 1    "A" 2014-1 4.14 4.25
# 2    "A" 2014-2 2.83 3.50
# 3    "B" 2014-3 3.71 3.50
# 4    "B" 2015-4 4.15 3.50
# 5    "B" 2016-4 4.63 3.50
# 6    "C" 2016-6 4.91 3.50
# 7    "C" 2017-7 5.31 5.00

初步问题

说我有这样的数据集,

df <- structure(list(yr_month = structure(1:7, .Label = c("2016-1", "2016-2", 
"2016-3", "2016-4", "2016-5", "2016-6", "2016-7"), class = "factor"), 
    a = c(4.14, 2.83, 3.71, 4.15, 4.63, 4.91, 5.31), b = c(4.25, 
    3.5, 3.5, 3.5, 3.5, 3.5, 5)), .Names = c("yrQ", "a", "b"
), row.names = c(NA, 7L), class = "data.frame")
df
#      yrQ    a    b
# 1 2016-1 4.14 4.25
# 2 2016-2 2.83 3.50
# 3 2016-3 3.71 3.50
# 4 2016-4 4.15 3.50
# 5 2016-5 4.63 3.50
# 6 2016-6 4.91 3.50
# 7 2016-7 5.31 5.00

现在,我可以使用ifelse()a数字变量进行分类。像这样,

df$a.cat <- ifelse(df$a < 3.8, c("tiny"), ifelse(df$a < 4.8, c("medium"), c("huge")) )
df
#      yrQ    a    b  a.cat
# 1 2016-1 4.14 4.25 medium
# 2 2016-2 2.83 3.50   tiny
# 3 2016-3 3.71 3.50   tiny
# 4 2016-4 4.15 3.50 medium
# 5 2016-5 4.63 3.50 medium
# 6 2016-6 4.91 3.50   huge
# 7 2016-7 5.31 5.00   huge

但是,如果我想创建一个表示某些时间段的变量,该怎么办?在2016年3月之前,2016-32016-32016-5之间以及2016-5之后说。我意识到我可以将数据转换为ts,然后使用window()将其剪切,然后将其重新组合在一起,但是并不是一种更智能的方法来使用if其他人在yrQ

这是我想要达到的目标,

  yr.cat    yrQ    a    b
1    "A" 2016-1 4.14 4.25
2    "A" 2016-2 2.83 3.50
3    "B" 2016-3 3.71 3.50
4    "B" 2016-4 4.15 3.50
5    "B" 2016-5 4.63 3.50
6    "C" 2016-6 4.91 3.50
7    "C" 2016-7 5.31 5.00

1 个答案:

答案 0 :(得分:1)

我们可以在从'yrQ'

中提取月子字符串后使用cut
df$yr.cat <- cut(as.numeric(sub(".*-", "", df$yrQ)), 
               breaks = c(-Inf,2, 5, Inf), labels = LETTERS[1:3])
df$yr.cat
#[1] A A B B B C C
#Levels: A B C

基于更新的示例

cut(as.numeric(sub("-", ".", df$yrQ)),
       breaks = c(-Inf, 2014.2, 2016.5, Inf), labels = LETTERS[1:3])
#[1] A A B B B C C
#Levels: A B C