【问题标题】:Creating dummy from multiple xts objects从多个 xts 对象创建虚拟对象
【发布时间】:2021-08-11 09:51:11
【问题描述】:

我有多个 xts 对象,如果股票高于或低于某个中值,它们都是指标。这些列表的结构如下:大小变量是 S 或 B,值变量是 H 或 L,动量变量是 D 或 U。这就是我的三个 xts 对象的一部分

 `         NESN ROG NOVN ZURN ABBN UBSG LONN 
1989-12-01 "B"  "B" "B"  "S"  "S"  "B"  NA  
1990-01-01 "B"  "B" "B"  "B"  "S"  "B"  NA`  

           NESN ROG NOVN ZURN ABBN UBSG LONN 
1989-12-01 "H"  "L" "L"  "H"  "L"  "L"  NA  
1990-01-01 "H"  "H" "L"  "H"  "L"  "L"  NA

          NESN ROG NOVN ZURN ABBN UBSG LONN 
1989-12-01 "D"  "U" "U"  "D"  "D"  "D"  NA  
1990-01-01 "D"  "U" "D"  "D"  "D"  "U"  NA

现在我想生成一个将这三个列表考虑在内的新列表,以便当股票位于 S、L 和 D 时,我可以创建一个等于 1 的虚拟变量。结果将如下所示:

           NESN ROG NOVN ZURN ABBN UBSG LONN 
1989-12-01 NA  NA   NA   NA   1    NA   NA  
1990-01-01 NA  NA   NA   NA   1    NA   NA

我尝试了以下方法:

SLD_dummy <- ifelse(big_small=="S" & high_low=="L" & up_down=="D",1,NA)

但是,我收到以下错误:

Error in `[.xts`(x, i, which.i = TRUE) : subscript out of bounds

有人知道我怎样才能得到想要的结果吗?提前感谢您的帮助。

【问题讨论】:

    标签: r xts


    【解决方案1】:

    您可以在您的 xts 对象上使用 replace

    library(xts)
    library(magrittr)
    big_small <- as.xts(read.table(text='       NESN ROG NOVN ZURN ABBN UBSG LONN 
                       1989-12-01 "B"  "B" "B"  "S"  "S"  "B"  NA  
                       1990-01-01 "B"  "B" "B"  "B"  "S"  "B"  NA'))
    
    high_low <- as.xts(read.table(text='       NESN ROG NOVN ZURN ABBN UBSG LONN 
    1989-12-01 "H"  "L" "L"  "H"  "L"  "L"  NA  
    1990-01-01 "H"  "H" "L"  "H"  "L"  "L"  NA'))
    
    up_down <- as.xts(read.table(text='        NESN ROG NOVN ZURN ABBN UBSG LONN 
    1989-12-01 "D"  "U" "U"  "D"  "D"  "D"  NA  
    1990-01-01 "D"  "U" "D"  "D"  "D"  "U"  NA'))
    
    m <- big_small=="S" & high_low=="L" & up_down=="D"
    replace(m, m==T, 1) %>% replace(., m==F, NA)
    #>            NESN ROG NOVN ZURN ABBN UBSG LONN
    #> 1989-12-01   NA  NA   NA   NA    1   NA   NA
    #> 1990-01-01   NA  NA   NA   NA    1   NA   NA
    
    

    reprex package (v2.0.0) 于 2021-05-22 创建

    (或者m[m==TRUE] &lt;- 1; m[m==FALSE] &lt;- NA

    【讨论】:

    • 谢谢,这正是我要找的我不知道你可以将 xts 对象与 &
    【解决方案2】:

    我们也可以在base R 中使用Map/Reduce 来执行此操作(使用R 4.1.0

    library(xts)
    Map(`==`, list(big_small, high_low, up_down), c('S', 'L', 'D')) |> 
        {\(x) Reduce(`&`, x)}() |> 
        {\(x) NA^(!x)}()
    

    -输出

    #          NESN ROG NOVN ZURN ABBN UBSG LONN
    #1989-12-01   NA  NA   NA   NA    1   NA   NA
    #1990-01-01   NA  NA   NA   NA    1   NA   NA
    

    数据

    big_small <- structure(c("B", "B", "B", "B", "B", "B", "S", "B", "S", "S", 
    "B", "B", NA, NA), .Dim = c(2L, 7L), .Dimnames = list(NULL, c("NESN", 
    "ROG", "NOVN", "ZURN", "ABBN", "UBSG", "LONN")), index = structure(c(628491600, 
    631170000), tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts", 
    "zoo"))
    
    high_low <- structure(c("H", "H", "L", "H", "L", "L", "H", "H", "L", "L", 
    "L", "L", NA, NA), .Dim = c(2L, 7L), .Dimnames = list(NULL, c("NESN", 
    "ROG", "NOVN", "ZURN", "ABBN", "UBSG", "LONN")), index = structure(c(628491600, 
    631170000), tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts", 
    "zoo"))
    
    up_down <- structure(c("D", "D", "U", "U", "U", "D", "D", "D", "D", "D", 
    "D", "U", NA, NA), .Dim = c(2L, 7L), .Dimnames = list(NULL, c("NESN", 
    "ROG", "NOVN", "ZURN", "ABBN", "UBSG", "LONN")), index = structure(c(628491600, 
    631170000), tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts", 
    "zoo"))
    

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2022-01-23
      • 2015-04-19
      相关资源
      最近更新 更多