我正在处理数据中的几个时间序列及其特征
长格式,我想构建几种不同类型的xts
利用data.table
语法的对象。以下是我的想法:
一些初步数据
library(data.table)
set.seed(1)
DT <- data.table(
dat = as.Date("2013-01-01") + rep(1:5, 2),
a = c(1, -1),
x = i <- rnorm(10),
y = 2 * i + rnorm(10),
z = 3 * i + rnorm(10))
让我们(尝试)构建3个不同的时间序列
DT[a == 1,{
x.ts <- xts(x, order.by = dat)
y.ts <- xts(y, order.by = dat)
}]
DT[
, list(sz = mead(z/x)), by = dat][ # operate on columns of the datatable
, z.ts <- xts(sz, order.by = dat)] # construct xts
此代码有两个问题:
y.ts
和z.ts
; j
环境中创建,而不是在全局环境中创建
环境。要解决(2),可以在全局环境中命名对象并使用<<-
:
x.ts <- y.ts <- z.ts <- NA
DT[a == 1,{
x.ts <<- xts(x, order.by = dat)
y.ts <<- xts(y, order.by = dat)
}
]
DT[
, list(sz = mean(z/x)), by = dat][
, z.ts <<- xts(sz, order.by = dat)]
确实
> z.ts
[,1]
2013-01-02 2.300730
2013-01-03 4.969685
2013-01-04 1.959377
2013-01-05 1.961270
2013-01-06 3.256254
如何在数据表中进行此类分配?
这种<<-
的使用是否合理,或者有更好的方法可以做到这一点?
答案 0 :(得分:2)
<<-
是合理的。
无论您在j
中执行什么操作,除非您使用:=
,否则如果您未将DT[]
的结果分配给某些内容,则最终会打印出`DT[]
的结果1}}在这些情况下j
和y.ts
分别评估(z.ts
参数的结果。
只是将这些调用包装成不可见的,它不会打印,或者使结果成为别的
使用隐形
#
x.ts <- y.ts <- z.ts <- NA
invisible(DT[a == 1,{
x.ts <<- xts(x, order.by = dat)
y.ts <<- xts(y, order.by = dat)
}
])
invisible(DT[
, list(sz = mean(z/x)), by = dat][
, z.ts <<- xts(sz, order.by = dat)])
将j
改为其他内容(沿路分配)
x.ts <- y.ts <- z.ts <- NA
DT[a == 1,{
x.ts <<- xts(x, order.by = dat)
y.ts <<- xts(y, order.by = dat)
'Assigned y.ts and x.ts to global environment)'
}
]
DT[
, list(sz = mean(z/x)), by = dat][
, {z.ts <<- xts(sz, order.by = dat)
'assigned x.ts'}]
在哪种情况下结果将是
<{1}}和'Assigned y.ts and x.ts to global environment)'
。