gpt4 book ai didi

r - 如何在给定时间戳的情况下从 Zoo/xts 对象中删除行

转载 作者:行者123 更新时间:2023-12-02 08:21:37 28 4
gpt4 key购买 nike

我很高兴使用这段代码运行:

z=lapply(filename_list, function(fname){
read.zoo(file=fname,header=TRUE,sep = ",",tz = "")
})
xts( do.call(rbind,z) )

直到脏数据出现在一个文件的末尾:

                        Open     High      Low    Close Volume
2011-09-20 21:00:00 1.370105 1.370105 1.370105 1.370105 1

这位于下一个文件的开头:

                        Open     High      Low  Close Volume
2011-09-20 21:00:00 1.370105 1.371045 1.369685 1.3702 2230

所以rbind.zoo提示重复。

我无法使用 something like :

 y <- x[ ! duplicated( index(x) ),  ]

因为它们位于列表内的不同动物园对象中。我不能使用aggregate,如 suggested here因为它们是动物园对象的列表,而不是一个大的动物园对象。由于重复项,我无法获得一个大对象。第 22 条军规。

因此,当事情变得困难时,困难的黑客将一些 for 循环组合在一起(请原谅打印和停止,因为这还不是工作代码):

indexes <- do.call("c", unname(lapply(z, index)))
dups=duplicated(indexes)
if(any(dups)){
duplicate_timestamps=indexes[dups]
for(tix in 1:length(duplicate_timestamps)){
t=duplicate_timestamps[tix]
print("We have a duplicate:");print(t)
for(zix in 1:length(z)){
if(t %in% index(z[[zix]])){
print(z[[zix]][t])
if(z[[zix]][t]$Volume==1){
print("-->Deleting this one");
z[[zix]][t]=NULL #<-- PROBLEM
}
}
}
}
stop("There are duplicate bars!!")
}

我遇到的问题是将 NULL 分配给动物园行并不会删除它(NextMethod("[<-") 中的错误:替换长度为零)。好的,所以我做了一个过滤器复制,没有违规的项目......但我被这些绊倒了:

> z[[zix]][!t,]
Error in Ops.POSIXt(t) : unary '!' not defined for "POSIXt" objects

> z[[zix]][-t,]
Error in `-.POSIXt`(t) : unary '-' is not defined for "POSIXt" objects

附注虽然对于“在动物园对象列表中重复行”这一实际问题的高级解决方案非常受欢迎,但这里的问题具体是关于如何在给定 POSIXt 索引对象的情况下从动物园对象中删除行。

<小时/>

一点测试数据:

list(structure(c(1.36864, 1.367045, 1.370105, 1.36928, 1.37039, 
1.370105, 1.36604, 1.36676, 1.370105, 1.367065, 1.37009, 1.370105,
5498, 3244, 1), .Dim = c(3L, 5L), .Dimnames = list(NULL, c("Open",
"High", "Low", "Close", "Volume")), index = structure(c(1316512800,
1316516400, 1316520000), class = c("POSIXct", "POSIXt"), tzone = ""), class = "zoo"),
structure(c(1.370105, 1.370115, 1.36913, 1.371045, 1.37023,
1.37075, 1.369685, 1.36847, 1.367885, 1.3702, 1.36917, 1.37061,
2230, 2909, 2782), .Dim = c(3L, 5L), .Dimnames = list(NULL,
c("Open", "High", "Low", "Close", "Volume")), index = structure(c(1316520000,
1316523600, 1316527200), class = c("POSIXct", "POSIXt"), tzone = ""), class = "zoo"))
<小时/>

更新:感谢G. Grothendieck对于行删除解决方案。在实际代码中我遵循了Joshua的建议和 GSee获取 xts 对象列表而不是 Zoo 对象列表。所以我的代码变成了:

z=lapply(filename_list, function(fname){
xts(read.zoo(file=fname,header=TRUE,sep = ",",tz = ""))
})
x=do.call.rbind(z)

(顺便说一句,请注意对 do.call.rbind 的调用。这是因为 rbind.xts 存在一些严重的内存问题。请参阅 https://stackoverflow.com/a/12029366/841830 )

然后我删除重复项作为后处理步骤:

dups=duplicated(index(x))
if(any(dups)){
duplicate_timestamps=index(x)[dups]
to_delete=x[ (index(x) %in% duplicate_timestamps) & x$Volume<=1]
if(nrow(to_delete)>0){
#Next line says all lines that are not in the duplicate_timestamp group
# OR are in the duplicate timestamps, but have a volume greater than 1.
print("Will delete the volume=1 entry")
x=x[ !(index(x) %in% duplicate_timestamps) | x$Volume>1]
}else{
stop("Duplicate timestamps, and we cannot easily remove them just based on low volume.")
}
}

最佳答案

如果 z1z2 是您的动物园对象,则进行 rbind 同时删除 z2 中的任何重复项:

rbind( z1, z2[ ! time(z2) %in% time(z1) ] )

关于删除动物园对象中具有指定时间的点,上面已经说明了这一点,但一般来说,如果tt是要删除的时间向量:

z[ ! time(z) %in% tt ]

或者如果我们知道 tt 中有一个元素,则 z[ time(z) != tt ]

关于r - 如何在给定时间戳的情况下从 Zoo/xts 对象中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944626/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com