2016-09-29 7 views
1

Я пытаюсь очистить некоторые данные о тике. Мои данные в большой форме. Когда я конвертирую его в широкий, он показывает Error: Duplicate identifiers for rows. В столбце Time есть временные метки в течение нескольких дней. В столбце 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") 

мне нужно сначала найти те же штампы времени затем взять медиану цены и размера этих меток времени, и заменить эту же отметки времени строки с одной строкой, содержащей средние значениями цены и РАЗМЕР в наборе данных. Но мой код суммирует весь столбец, а не те же строки временного штампа для символа запаса. Это моя попытка:

#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

Что ожидаемый результат примера вы предоставили? «Ошибка: не вектор» - это потому, что вы не определяете переменную для «медианного» и «среднего» – Sotos

+0

. Я хочу отображать медианную ЦЕНУ и РАЗМЕР для дублирования штампов времени для каждого запаса. – runjumpfly

+0

sp 'jojo%>% group_by (время, SYM)%>% mutate (PRICE = медиана (PRICE), SIZE = медиана (SIZE))%>% filter (duplicated (Time))'? – Sotos

ответ

2

Вам нужно выбрать, хотите ли вы использовать парадигму dplyr или xts. Они не играют хорошо вместе, главным образом потому, что dplyr ожидает, что data.frames и xts объекты - это матрицы. dplyr также маскирует stats::lag generic, что предотвращает отправку метода (например, запуск 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