【问题标题】:Rearrange unbalanced time series data重新排列不平衡的时间序列数据
【发布时间】:2018-08-28 19:56:30
【问题描述】:

我有一个包含股票回报数据的大型不平衡数据集(大约 2000 只股票),现在我想重新排列回报数据,所以它们都在同一日期结束。

我的数据如下所示:

Date         RF   STOCK-A  STOCK-B  STOCK-C  STOCK-D 
1990-11-30   0,03   0,20    0,30     -0,40     0,90
1990-12-31   0,10   0,30    0,30     -0,40     0,34
1991-01-31   0,12   0,90    0,30     -0,60     0,78
1991-02-28   0,03   0,12    0,30       NA      0,50
1991-03-31   0,04   0,14    0,30       NA      0,12
1991-04-30   0,05   0,18    0,30       NA      0,11
1991-05-31   0,03   0,00     NA        NA       NA
1991-06-30   0,00   0,20     NA        NA       NA

我的问题是,我希望所有股票收益都以 1991-06-30 结束,并在早期填写 NA,所以它看起来像这样:

 Date         RF   STOCK-A  STOCK-B  STOCK-C  STOCK-D 
1990-11-30   0,03   0,20     NA    -   NA      NA
1990-12-31   0,10   0,30     NA        NA      NA
1991-01-31   0,12   0,90    0,30       NA     0,90
1991-02-28   0,03   0,12    0,30       NA     0,34
1991-03-31   0,04   0,14    0,30       NA     0,78
1991-04-30   0,05   0,18    0,30     -0,40    0,50
1991-05-31   0,03   0,00    0,30     -0,40    0,12 
1991-06-30   0,00   0,20    0,30     -0,60    0,11 

我尝试使用这样的滞后功能:

data2 <- if (any(is.na(data$STOCK-B))==TRUE){
lag(data$STOCK-B, k= -sum(is.na(data$STOCK-B)))
}else {
any(is.na(data$STOCK-B)==FALSE) 
lag(data$STOCK-B, k=0)
}

我的想法是在 for 循环中实现它,但它不起作用,只是返回一个原子向量。

我找到了另一种使用 DataCombine 包的方法:

 Data1 <- slide(data, Var = "data$STOCK-B", slideBy = -sum(is.na(data$STOCK- 
 B)))

它根据需要向下移动数据,但在数据集中输入一个新变量。当然,我可以使用那个方法,然后将新的变量提取到一个新的数据集中,但这如何使它更有效呢?

提前谢谢你!!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    对于每一列,将 NA 与非 NA 连接起来:

    moveNA <- function(x) c(Filter(is.na, x), na.omit(x))
    replace(data, -1, lapply(data[-1], moveNA))
    

    给予:

            Date   RF STOCK.A STOCK.B STOCK.C STOCK.D
    1 1990-11-30 0.03    0.20      NA      NA      NA
    2 1990-12-31 0.10    0.30      NA      NA      NA
    3 1991-01-31 0.12    0.90     0.3      NA    0.90
    4 1991-02-28 0.03    0.12     0.3      NA    0.34
    5 1991-03-31 0.04    0.14     0.3      NA    0.78
    6 1991-04-30 0.05    0.18     0.3    -0.4    0.50
    7 1991-05-31 0.03    0.00     0.3    -0.4    0.12
    8 1991-06-30 0.00    0.20     0.3    -0.6    0.11
    

    另一种更短的moveNA 是:

    moveNA <- function(x) x[order(!is.na(x))]
    

    注意

    使用的可重现形式的输入 data 是:

    data <-
    structure(list(Date = structure(1:8, .Label = c("1990-11-30", 
    "1990-12-31", "1991-01-31", "1991-02-28", "1991-03-31", "1991-04-30", 
    "1991-05-31", "1991-06-30"), class = "factor"), RF = c(0.03, 
    0.1, 0.12, 0.03, 0.04, 0.05, 0.03, 0), STOCK.A = c(0.2, 0.3, 
    0.9, 0.12, 0.14, 0.18, 0, 0.2), STOCK.B = c(0.3, 0.3, 0.3, 0.3, 
    0.3, 0.3, NA, NA), STOCK.C = c(-0.4, -0.4, -0.6, NA, NA, NA, 
    NA, NA), STOCK.D = c(0.9, 0.34, 0.78, 0.5, 0.12, 0.11, NA, NA
    )), class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

      【解决方案2】:

      我们可以定义一个函数来帮助排序,然后使用dplyr包中的mutate_at对每一列进行排序。

      library(dplyr)
      
      sort_fun <- function(x){
        x_NA <- x[is.na(x)]
        x_non_NA <- x[!is.na(x)]
        x <- c(x_NA, x_non_NA)
        return(x)
      }
      
      dat2 <- dat %>%
        mutate_at(vars(-Date), funs(sort_fun(.)))
      dat2
      #         Date   RF STOCK.A STOCK.B STOCK.C STOCK.D
      # 1 1990-11-30 0,03    0,20    <NA>    <NA>    <NA>
      # 2 1990-12-31 0,10    0,30    <NA>    <NA>    <NA>
      # 3 1991-01-31 0,12    0,90    0,30    <NA>    0,90
      # 4 1991-02-28 0,03    0,12    0,30    <NA>    0,34
      # 5 1991-03-31 0,04    0,14    0,30    <NA>    0,78
      # 6 1991-04-30 0,05    0,18    0,30   -0,40    0,50
      # 7 1991-05-31 0,03    0,00    0,30   -0,40    0,12
      # 8 1991-06-30 0,00    0,20    0,30   -0,60    0,11
      

      数据

      dat <- read.table(text = "Date         RF   STOCK-A  STOCK-B  STOCK-C  STOCK-D 
      1990-11-30   0,03   0,20    0,30     -0,40     0,90
                        1990-12-31   0,10   0,30    0,30     -0,40     0,34
                        1991-01-31   0,12   0,90    0,30     -0,60     0,78
                        1991-02-28   0,03   0,12    0,30       NA      0,50
                        1991-03-31   0,04   0,14    0,30       NA      0,12
                        1991-04-30   0,05   0,18    0,30       NA      0,11
                        1991-05-31   0,03   0,00     NA        NA       NA
                        1991-06-30   0,00   0,20     NA        NA       NA",
                        header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        【解决方案3】:

        我会使用apply 函数:

        apply(data,2,function(x) as.numeric(x[order(!is.na(x))]))
        

        数据

        data <-structure(list(Date = structure(1:8, .Label = c("1990-11-30", 
        "1990-12-31", "1991-01-31", "1991-02-28", "1991-03-31", "1991-04-30", 
        "1991-05-31", "1991-06-30"), class = "factor"), RF = c(0.03, 
        0.1, 0.12, 0.03, 0.04, 0.05, 0.03, 0), STOCK.A = c(0.2, 0.3, 
        0.9, 0.12, 0.14, 0.18, 0, 0.2), STOCK.B = c(0.3, 0.3, 0.3, 0.3, 
        0.3, 0.3, NA, NA), STOCK.C = c(-0.4, -0.4, -0.6, NA, NA, NA, 
        NA, NA), STOCK.D = c(0.9, 0.34, 0.78, 0.5, 0.12, 0.11, NA, NA
        )), class = "data.frame", row.names = c(NA, -8L))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-13
          • 2014-06-19
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 2021-03-11
          • 2017-04-20
          相关资源
          最近更新 更多