如何添加季节性虚拟变量?

时间:2017-07-10 11:28:14

标签: r data.table dummy-variable

我想根据季度在R data.table添加季节性假人。我看了很多例子,但我还没有能够解决这个问题。我对R的了解有限,所以我想知道你是否能让我走上正轨。

我的data.table看起来像这样:

    Year_week  artist_id  number_of_events number_of_streams
   1:     16/30    8296         1            957892
   2:     16/33    8296         6            882282
   3:     16/34    8296         5            926037
   4:     16/35    8296         2            952704
   5:     15/37    17879        1             89515
   6:     16/22    22690        2            119653

我想要的是这样的格式:

 Year_week  artist_id  number_of_events number_of_streams Q2 Q3 Q4
   1:     16/50    8296         1            957892        0  0  1       

3 个答案:

答案 0 :(得分:4)

两种方法:

1)使用dcastcutsub

dcast(DT[, Q := cut(as.integer(sub('.*/','',Year_week)),
                    breaks = c(0,13,26,39,53),
                    labels = paste0('Q',1:4))],
      Year_week + artist_id + number_of_events + number_of_streams ~ Q,
      value.var = 'Q',
      drop = c(TRUE,FALSE),
      fun = length)

给出:

   Year_week artist_id number_of_events number_of_streams Q1 Q2 Q3 Q4
1:     15/37     17879                1             89515  0  0  1  0
2:     16/22     22690                2            119653  0  1  0  0
3:     16/30      8296                1            957892  0  0  1  0
4:     16/33      8296                6            882282  0  0  1  0
5:     16/34      8296                5            926037  0  0  1  0
6:     16/35      8296                2            952704  0  0  1  0

这是做什么的:

  • as.integer(sub('.*/','',Year_week))Year_week
  • 中提取周数
  • 使用cut,您可以使用适当的标签将其划分为四分之一(另请参阅?cut
  • 使用dcast,您可以使用聚合函数(length)将四分之一列转换为宽格式。在drop = c(TRUE,FALSE)函数中使用dcast,可以确保包含所有季度。

注意:

  • Q - 列是一个有序因子,因此您也可以使用它来排列和过滤数据。
  • 根据假柱的使用情况:您并不总是需要这些。如果要将它们用作分组或过滤变量,则可以使用Q变量。
  • 但是,一些统计测试需要虚拟变量(证明dcast步骤的合理性。)

2)使用cutsublapply

DT[, Q := cut(as.integer(sub('.*/','',Year_week)),
              breaks = c(0,13,26,39,53),
              labels = paste0('Q',1:4))
   ][, paste0('Q',1:4) := lapply(paste0('Q',1:4), function(q) as.integer(q == Q))][]

给出了类似的结果。您只需检查其中一个季度标签是否位于dcast - 列中,而不是使用Q进行转置。

使用过的数据:

DT <- fread(' Year_week  artist_id  number_of_events number_of_streams
     16/30    8296         1            957892
     16/33    8296         6            882282
     16/34    8296         5            926037
     16/35    8296         2            952704
     15/37    17879        1             89515
     16/22    22690        2            119653')

答案 1 :(得分:1)

我认为Year_week是我们可以提取条目日期的地方。

library(data.table)

whichQuart <- function(x){
  data.frame(+(x <= 13),
    +(x >13 & x <= 26),
    +(x > 26 & x <= 39),
    +(x > 39 & x <= 52))
}

dt <-     setDT(read.table(text="Year_week  artist_id  number_of_events number_of_streams
1:     16/30    8296         1            957892
2:     16/33    8296         6            882282
3:     16/34    8296         5            926037
4:     16/35    8296         2            952704
5:     15/37    17879        1             89515
6:     16/22    22690        2            119653", header=TRUE, stringsAsFactors=FALSE))

dt[, week := strsplit(Year_week, "/")[2]]  
dt[, c("Q1", "Q2", "Q3", "Q4") := whichQuart(week)]

#   Year_week artist_id number_of_events number_of_streams week Q1 Q2 Q3 Q4
#1:     16/30      8296                1            957892   16  0  1  0  0
#2:     16/33      8296                6            882282   33  0  0  1  0
#3:     16/34      8296                5            926037   16  0  1  0  0
#4:     16/35      8296                2            952704   33  0  0  1  0
#5:     15/37     17879                1             89515   16  0  1  0  0
#6:     16/22     22690                2            119653   33  0  0  1  0

答案 2 :(得分:-3)

quarter

中添加df
df$quarter <- as.factor(df$quarter)
df <- cbind(df, model.matrix(~quarter, df))

希望这有效!