从多个 xts 对象创建虚拟对象
Creating dummy from multiple xts objects
我有多个 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
现在我想生成一个将这三个列表考虑在内的新列表,这样我就可以创建一个等于 1 的虚拟变量,例如当股票在 S、L 和 D 时。结果看起来像这个:
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
有人知道我怎样才能得到想要的结果吗?预先感谢您的帮助。
您可以在 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] <- 1; m[m==FALSE] <- NA
)
我们也可以在 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"))
我有多个 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
现在我想生成一个将这三个列表考虑在内的新列表,这样我就可以创建一个等于 1 的虚拟变量,例如当股票在 S、L 和 D 时。结果看起来像这个:
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
有人知道我怎样才能得到想要的结果吗?预先感谢您的帮助。
您可以在 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] <- 1; m[m==FALSE] <- NA
)
我们也可以在 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"))