6

私はこのコードで幸せに走っていました:

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

ダーティデータが1つのファイルの最後にこれと一緒に来るまで:

                        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重複について文句を言う。

私は次のようなものを使用することはできません:

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

リスト内のさまざまな動物園オブジェクトにあるためです。また、ここで提案されているように、これらは1つの大きな動物園オブジェクトではなく、動物園オブジェクトのリストであるためaggregate、使用できません。そして、私は複製の1つの大きなオブジェクト'cosを取得できません。キャッチ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( "[<-")のエラー:置換の長さはゼロです)。OK、それで私は問題のあるアイテムなしでフィルターコピーをします...しかし私はこれらにつまずきます:

> 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

PS「動物園オブジェクトのリスト全体で行を複製する」という私の実際の問題に対する高レベルの解決策は大歓迎ですが、ここでの質問は、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に感謝します。実際のコードでは、JoshuaGSeeのアドバイスに従って、zooオブジェクトのリストではなくxtsオブジェクトのリストを取得しました。だから私のコードは次のようになりました:

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.")
        }
    }
4

3 に答える 3

9

z1z2が動物園のオブジェクトである場合は、rbindの重複を削除しますz2

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

指定された時間を持つ動物園オブジェクトのポイントを削除することに関して、上記はすでにこれを示していますが、一般に、ttが削除する時間のベクトルである場合:

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

ttまたは、 thenに単一の要素があることがわかっている場合z[ time(z) != tt ]

于 2012-08-14T03:05:27.947 に答える
3

rbind.xts重複したインデックス値を許可するため、最初に xts に変換すると機能する可能性があります。

x <- lapply(z, as.xts)
y <- do.call(rbind, x)
# keep last value of any duplicates
y <- y[!duplicated(index(y),fromLast=TRUE),]
于 2012-08-14T02:19:40.673 に答える
2

xts最初に変換した方が運がいいと思います。

a <- structure(c(1.370105, 1.370105, 1.370105, 1.370105, 1), .Dim = c(1L, 
5L), index = structure(1316570400, tzone = "", tclass = c("POSIXct", 
"POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", 
"POSIXt"), .indexTZ = "", tzone = "", .Dimnames = list(NULL, 
    c("Open", "High", "Low", "Close", "Volume")), class = c("xts", 
"zoo"))

b <- structure(c(1.370105, 1.371045, 1.369685, 1.3702, 2230), .Dim = c(1L, 
5L), index = structure(1316570400, tzone = "", tclass = c("POSIXct", 
"POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", 
"POSIXt"), .indexTZ = "", tzone = "", .Dimnames = list(NULL, 
    c("Open", "High", "Low", "Close", "Volume")), class = c("xts", 
"zoo"))


(comb <- rbind(a, b))
#                        Open     High      Low    Close Volume
#2011-09-20 21:00:00 1.370105 1.370105 1.370105 1.370105      1
#2011-09-20 21:00:00 1.370105 1.371045 1.369685 1.370200   2230

dupidx <- index(comb)[duplicated(index(comb))] # indexes of duplicates
tail(comb[dupidx], 1) #last duplicate
# now rbind the last duplicated row with all non-duplicated data
rbind(comb[!index(comb) %in% dupidx], tail(comb[dupidx], 1)) 
于 2012-08-14T02:14:21.940 に答える