我想在一个xts对象中创建多个用零填充的列。我可以手动使用此代码:
> class(data)
[1] "xts" "zoo"
> colnames(data)
[1] "A" "B"
> data$C <- 0
> colnames(data)
[1] "A" "B" "C"
但不幸的是,在for
循环中,i
被解释为对象名而不是变量。
> symbols
[1] "D" "E" "F"
for (i in symbols) {
data$i <- 0
}
> colnames(data)
> [1] "A" "B" "C" "i"
当我使用[[
时,程序化等效于$
,然后colnames(data)
会返回NULL
。
最后,我尝试使用如下所示的apply
系列函数,但它不能按预期工作。
> sapply(symbols, function(i) {data$i <- 0})
D E F
0 0 0
这可能是最好的解决方案吗? 提前致谢
答案 0 :(得分:1)
您可以尝试:
do.call(cbind,setNames(c(list(data),rep(list(0),length(symbols))),
c("",symbols)))
答案 1 :(得分:1)
我建议使用所需的列名和值创建一个新的xts对象,然后使用原始数据创建merge
。
require(xts)
data <- xts(cbind(A=1:5,B=5:1), Sys.Date()-5:1)
symbols <- LETTERS[3:6]
zeros <- xts(matrix(0,nrow(data),length(symbols)),
index(data), dimnames=list(NULL,symbols))
data <- merge(data, zeros)
这使得所做的事情变得明确,因此对未来你来说不那么容易混淆。 :)