2016-09-29 6 views
1

ダニデータの一部をクリーニングしようとしています。私のデータは長い形式です。ワイドに変換すると、 Error: Duplicate identifiers for rowsと表示されます。 [時間]列には、数日間のタイムスタンプがあります。 SYM列には多くの株式の株価記号があります。これは私のサンプルデータです:NON DISTINCTタイムスタンプの列値の中央値を取る方法

dput(jojo) 
structure(list(Time = structure(c(1459481850, 1459481850, 1459482302, 
1459482305, 1459482305, 1459482307, 1459482307, 1459482309, 1459482312, 
1459482312, 1459482314, 1459482314, 1459482316, 1459482316, 1459482317, 
1459482317, 1459482318, 1459482319, 1459482319, 1459482320), class = c("POSIXct", 
"POSIXt"), tzone = "Asia/Calcutta"), PRICE = c(1371.25, 1371.25, 
1373.95, 1373, 1373, 1373.95, 1373.95, 1373.9, 1374, 1374, 1374.15, 
1374.15, 1374, 1374, 1373.85, 1373.85, 1372.55, 1374.05, 1374.05, 
1374.15), SIZE = c(39, 58, 5, 4, 7, 20, 5, 10, 21, 179, 10, 100, 
98, 78, 14, 11, 30, 10, 11, 39), SYM = c("A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B")), .Names = c("Time", "PRICE", "SIZE", "SYM"), row.names = c(NA, 
20L), class = "data.frame") 

私は、これらのタイムスタンプのために価格とサイズの中央値を取り、価格の中央値を含む単一の行にこれらの同じタイムスタンプ列を置き換える最初、同じタイムスタンプを見つける必要があるとデータセットのSIZE。しかし、私のコードは、株価記号と同じタイムスタンプ行ではなく、列全体を要約しています。これは私の試みです:

#Cleaning duplicate time stamps 
tt<- jojo %>%group_by(SYM)%>% summarise(Time = ifelse(n() >= 2, median, mean)) 
#Making wide form 
tt<-spread(tt, SYM, PRICE) 

私はこのエラーを取得しています:

Error in eval(substitute(expr), envir, enclos) : Not a vector 

は修正を提案してください。高周波数パッケージを使わずにクリーニングを実行できるといいですね。

+0

あなたが提供した例の期待される出力とは何ですか? 'Error:Not a Vector'は、' median'と 'mean'の変数を定義していないためです。 – Sotos

+0

各在庫の重複タイムスタンプのPRICEとSIZEの中央値を取っています。 – runjumpfly

+0

sp> jojo%>%group_by(Time、SYM)%>%mutate(PRICE =中央値(PRICE)、SIZE =中央値(SIZE))%>%フィルタ(重複(時間)) '? – Sotos

答えて

2

dplyrまたはxtsのどちらのパラダイムを使用するかを選択する必要があります。彼らはよく一緒に遊ぶわけではありません。なぜなら、dplyrはdata.framesを期待し、xtsオブジェクトは行列だからです。 dplyrはまたstats::lagジェネリックをマスクするので、メソッドのディスパッチを防ぐことができます(たとえば、トップレベルのlag(.xts(1,1))を実行すると、期待通りの結果が得られません)。 xtsパラダイムを使用してこの問題を解決するために

# create a function to convert to xts and take medians of the two columns 
unDuplicate <- function(x) { 
    # create xts object 
    X <- xts(x[,c("PRICE","SIZE")], x[,"Time"]) 
    # set column names so they will be unique in wide format 
    colnames(X) <- paste(colnames(X), x[1,"SYM"], sep = ".") 
    # function to take median of each column 
    colMedian <- function(obj, ...) { 
    apply(obj, 2, median, ...) 
    } 
    # aggregate by seconds 
    period.apply(X, endpoints(X, "seconds"), colMedian) 
} 
# now you can call the function on each symbol, then merge the results 
do.call(merge, lapply(split(jojo, jojo$SYM), unDuplicate)) 
+0

私は似たような質問をする助けてくださいhttp://stackoverflow.com/questions/40317111/performing-previous-tick-aggregation-using-lapply-and-split – runjumpfly

関連する問題