如何向单变量动物园系列添加一列?
How do you add a column to a univariate zoo series?
假设我有一个单变量动物园系列:
v <- read.zoo(data.frame(dt=c(as.Date('2019-01-01')+1:10), vals=1:10))
v
2019-01-02 2019-01-03 2019-01-04 2019-01-05 2019-01-06 2019-01-07 2019-01-08 2019-01-09 2019-01-10 2019-01-11
1 2 3 4 5 6 7 8 9 10
我想把它变成一个普通的动物园系列,增加一个列 val2
比方说 "test":
val val2
2019-01-02 1 test
2019-01-03 2 test
...
我尝试了以下方法。它在逻辑上不应该工作(因为动物园对象是单变量的)但我认为因为这适用于 data.frame
它可能会工作或者我会得到一个错误或警告来引导我走向正确的道路但令人惊讶的是没有'没有发生,但它做了一些事情非常糟糕...:[=16=]
cbind(v, val2="test")
v val2
1970-01-02 <NA> test
2019-01-02 1 <NA>
2019-01-03 2 <NA>
2019-01-04 3 <NA>
2019-01-05 4 <NA>
2019-01-06 5 <NA>
2019-01-07 6 <NA>
2019-01-08 7 <NA>
2019-01-09 8 <NA>
2019-01-10 9 <NA>
2019-01-11 10 <NA>
我原以为它会用以下值填充 val2
:"test" 或给我一些 warnings/errors。
因此,将额外列绑定到单变量动物园系列的正确方法是将另一个单变量系列绑定到它,索引与原始系列相同。所以就我而言,我必须这样做:
cbind(v, val2 = zoo("test", index(v))
谢谢@marcus 的提示。 @markus,如果您想提出更好的答案,请随时 post 您的回答,我将删除此解释,以便您对您的回答给予充分评价。
动物园对象的数据是矩阵,矩阵不能有混合类型。特别是,它不能混合使用数字和字符数据。
假设新列是 val2
,如下所示。那么
library(zoo)
val2 <- 101:110
cbind(val = v, val2) # v is from question
给予:
val val2
2019-01-02 1 101
2019-01-03 2 102
2019-01-04 3 103
2019-01-05 4 104
2019-01-06 5 105
2019-01-07 6 106
2019-01-08 7 107
2019-01-09 8 108
2019-01-10 9 109
2019-01-11 10 110
或者你也可以这样做:
val2 <- 1
cbind(val = v, val2)
给予:
val val2
2019-01-02 1 1
2019-01-03 2 1
2019-01-04 3 1
2019-01-05 4 1
2019-01-06 5 1
2019-01-07 6 1
2019-01-08 7 1
2019-01-09 8 1
2019-01-10 9 1
2019-01-11 10 1
已添加
实际上这在使用 zoo 的开发版本时确实有效。
# install development version of zoo
install.packages("zoo", repos="http://R-Forge.R-project.org")
res <- cbind(val = v, val2 = "test")
str(res)
给出一个字符矩阵作为数据
‘zoo’ series from 2019-01-02 to 2019-01-11
Data: chr [1:10, 1:2] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "test" "test" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "val" "val2"
Index: Date[1:10], format: "2019-01-02" "2019-01-03" "2019-01-04" "2019-01-05" "2019-01-06" ...
看起来像这样
> res
val val2
2019-01-02 1 test
2019-01-03 2 test
2019-01-04 3 test
2019-01-05 4 test
2019-01-06 5 test
2019-01-07 6 test
2019-01-08 7 test
2019-01-09 8 test
2019-01-10 9 test
2019-01-11 10 test
假设我有一个单变量动物园系列:
v <- read.zoo(data.frame(dt=c(as.Date('2019-01-01')+1:10), vals=1:10))
v
2019-01-02 2019-01-03 2019-01-04 2019-01-05 2019-01-06 2019-01-07 2019-01-08 2019-01-09 2019-01-10 2019-01-11
1 2 3 4 5 6 7 8 9 10
我想把它变成一个普通的动物园系列,增加一个列 val2
比方说 "test":
val val2
2019-01-02 1 test
2019-01-03 2 test
...
我尝试了以下方法。它在逻辑上不应该工作(因为动物园对象是单变量的)但我认为因为这适用于 data.frame
它可能会工作或者我会得到一个错误或警告来引导我走向正确的道路但令人惊讶的是没有'没有发生,但它做了一些事情非常糟糕...:[=16=]
cbind(v, val2="test")
v val2
1970-01-02 <NA> test
2019-01-02 1 <NA>
2019-01-03 2 <NA>
2019-01-04 3 <NA>
2019-01-05 4 <NA>
2019-01-06 5 <NA>
2019-01-07 6 <NA>
2019-01-08 7 <NA>
2019-01-09 8 <NA>
2019-01-10 9 <NA>
2019-01-11 10 <NA>
我原以为它会用以下值填充 val2
:"test" 或给我一些 warnings/errors。
因此,将额外列绑定到单变量动物园系列的正确方法是将另一个单变量系列绑定到它,索引与原始系列相同。所以就我而言,我必须这样做:
cbind(v, val2 = zoo("test", index(v))
谢谢@marcus 的提示。 @markus,如果您想提出更好的答案,请随时 post 您的回答,我将删除此解释,以便您对您的回答给予充分评价。
动物园对象的数据是矩阵,矩阵不能有混合类型。特别是,它不能混合使用数字和字符数据。
假设新列是 val2
,如下所示。那么
library(zoo)
val2 <- 101:110
cbind(val = v, val2) # v is from question
给予:
val val2
2019-01-02 1 101
2019-01-03 2 102
2019-01-04 3 103
2019-01-05 4 104
2019-01-06 5 105
2019-01-07 6 106
2019-01-08 7 107
2019-01-09 8 108
2019-01-10 9 109
2019-01-11 10 110
或者你也可以这样做:
val2 <- 1
cbind(val = v, val2)
给予:
val val2
2019-01-02 1 1
2019-01-03 2 1
2019-01-04 3 1
2019-01-05 4 1
2019-01-06 5 1
2019-01-07 6 1
2019-01-08 7 1
2019-01-09 8 1
2019-01-10 9 1
2019-01-11 10 1
已添加
实际上这在使用 zoo 的开发版本时确实有效。
# install development version of zoo
install.packages("zoo", repos="http://R-Forge.R-project.org")
res <- cbind(val = v, val2 = "test")
str(res)
给出一个字符矩阵作为数据
‘zoo’ series from 2019-01-02 to 2019-01-11
Data: chr [1:10, 1:2] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "test" "test" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "val" "val2"
Index: Date[1:10], format: "2019-01-02" "2019-01-03" "2019-01-04" "2019-01-05" "2019-01-06" ...
看起来像这样
> res
val val2
2019-01-02 1 test
2019-01-03 2 test
2019-01-04 3 test
2019-01-05 4 test
2019-01-06 5 test
2019-01-07 6 test
2019-01-08 7 test
2019-01-09 8 test
2019-01-10 9 test
2019-01-11 10 test