嗨,我想在包中使用R ddply中的plyr库MC.它似乎没有加快计算速度.这是我运行的代码:
require(doMC)
registerDoMC(4)
getDoParWorkers()
##> 4
test <- data.frame(x=1:10000, y=rep(c(1:20), 500))
system.time(ddply(test, "y", mean))
# user system elapsed
# 0.015 0.000 0.015
system.time(ddply(test, "y", mean, .parallel=TRUE))
# user system elapsed
# 223.062 2.825 1.093
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在做R中的经典拆分应用重组.我的数据集随着时间的推移是一堆公司.我正在进行的应用是为每家公司运行回归并返回残差,因此,我不是按公司汇总. plyr这很好,但是当公司数量很大时,需要很长时间才能运行.有没有办法做到这一点data.table?
样本数据:
dte, id, val1, val2
2001-10-02, 1, 10, 25
2001-10-03, 1, 11, 24
2001-10-04, 1, 12, 23
2001-10-02, 2, 13, 22
2001-10-03, 2, 14, 21
Run Code Online (Sandbox Code Playgroud)
我需要按每个id(即1和2)进行拆分.运行回归,返回残差并将其作为列添加到我的数据中.有没有办法使用data.table?
我xts在索引为POSIXct和时区为GMT 的对象中有一堆1分钟的返回.回报是在纽约证券交易所,所以我想转换到东部时区,但我想妥善照顾夏令时.这样做的最佳方式是什么?我在EST时区和EDT时区之间有点困惑.我想在冬季和夏季将我的时间恰当地转换为纽约时报.
我想看看人们用R来处理具有大型数据集(即50 mil + obs)的面板数据的方法:该data.table软件包很有用,因为它有密钥并且非常快.该xts软件包非常有用,因为它具有执行各种时间序列的功能.因此,似乎有两个不错的选择:
data.table并编写自定义时间序列函数来处理它xts对象列表,并lapply在每次要执行某些操作时在该列表上运行.最终这需要合并为一个data.frame回归等.我知道这个plm包,但没有发现它对数据管理有用,就像上面的两个选项一样.你们用的是什么?什么时候最好的想法?
让我提出一个场景:假设有N个公司有T个时间段,其中N >> 0和T >> 0.data.table如果我想让每个公司滞后一段时间,那将会超级快,例如:
x <- data.table(id=1:10, dte=rep(seq(from=as.Date("2012-01-01"), to=as.Date("2012-01-10"), by="day"), each=10), val=1:100, key=c("id", "dte"))
x[,lag_val:=c(NA, head(val, -1)),by=id]
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是:
y <- lapply(ids, function(i) {xts(x[id==i, val], order.by=x[id == i, dte])})
y <- lapply(y, function(obj) { cbind(obj, lag(obj, 1)) })
Run Code Online (Sandbox Code Playgroud)
前者的优势在于它具有大数据的速度.后者的优点是能够做类似的事情period.apply并使用其他功能xts.是否有提高xts表示速度的技巧?也许是两者的结合?xts看来,从对象转换到对象是昂贵的.
我想在一个使用中ccf为一个id变量的不同值绘制一些图.问题是返回一个不符合的值.我不关心返回值,只想看实际情节.一些代码:data.tableRccfdata.table
require(data.table)
x <- data.table(id=rep(1:10, each=10), a=rep(1:10,10), b=rep(10:1,10))
x[,ccf(a,b),by=id]
Error in `[.data.table`(x, , ccf(a, b), by = id) :
All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead (much quicker), or cbind or merge afterwards.
Run Code Online (Sandbox Code Playgroud) 为了清除自己的一些内容,我想更好地了解复制何时以及何时复制data.table.正如这个问题所指出的那样,确切地了解data.table是否是对另一个data.table的引用(vs副本),如果只是运行以下内容,那么最终修改原始数据:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Run Code Online (Sandbox Code Playgroud)
但是,如果这样做(例如),那么您最终修改新版本:
DT = data.table(a=1:10)
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10 …Run Code Online (Sandbox Code Playgroud) 当写操作设一些表达j上的data.table,.SD不包含表中的所有列,而是只表达式使用的人.这适用于运行但不适合调试.查看所有列的最佳方法是什么?我可以传递所有的名字,.SDcols但这似乎相当乏味.例如:
x = data.table(a=1:10, b=10:1, id=1:5)
x[,{ browser(); a+1},by=id]
Called from: `[.data.table`(x, , {
browser()
a + 1
}, by = id)
Browse[1]> n
debug at #1: a + 1
Browse[1]> .SD
a
1: 1
2: 6
Run Code Online (Sandbox Code Playgroud) 我tryCatch用来捕捉发生的任何错误。但是,即使我捕获它们并返回适当的错误值,看起来我的批处理系统的日志中仍然报告错误。有没有办法完全抑制错误并简单地继续我提供的错误处理?
在调试一个函数时(已被标记为 debug using debug("f"),调试器会给你Browser提示,它还会告诉你你在程序中的哪个行号。如果在提示下运行几个测试语句(检查变量等)屏幕滚动,我不再知道我在哪个行号(使用 SecureCRT,所以它滚动通过缓冲区)。该命令where只告诉你你在哪个函数中。有谁知道如何获取实际的行号和下一条语句被处决?
谢谢
我在R中有一个动物园对象,它有每日数据,并且错过了周末.当我尝试ar()在对象上运行某些函数时(例如)我得到错误:
mkt.ar <- ar(zoo_object)
Error in na.fail.default(as.ts(x)) : missing values in object
Run Code Online (Sandbox Code Playgroud)
如果我做:
mkt.ar <- ar(zoo_object, na.action=na.omit)
Error in na.omit.ts(as.ts(x)) : time series contains internal NAs
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为当动物园试图将事物转换为ts时,周末本来就缺失了.除了将事物转换为使用coredata(zoo_object)和运行的向量之外ar(),有没有办法告诉R跳过丢失的数据?
谢谢
r ×10
data.table ×5
plyr ×2
xts ×2
zoo ×2
apply ×1
correlation ×1
debugging ×1
mc ×1
missing-data ×1
plot ×1
posixct ×1
split ×1
time-series ×1
timezone ×1