2015-12-10 2 views
1

У меня очень большой фрейм данных (около 1 ГБ и 1 миллион строк), который имеет наблюдения с 10 до 16 часов. Я хотел бы сделать некоторые графики с geom_step, которые приближаются к 1: 00: 00-1: 00: 05pm, поэтому я решил, что для экономии памяти и времени было бы быстрее подмножить исходные данные. (вместо того, чтобы рисовать все и затем увеличивать). К сожалению, пока что вскрытие не является вариантом. Поскольку я работаю с geom_step, мне нужно обернуть подмножество до и после значений, иначе все будет неправильно построено.Обтекание подмножества кадра данных с ближайшими наблюдениями по обе стороны от подмножества в факторе

Вот набор данных примера, который на самом деле гораздо меньше, чем мои данные, но принцип там:

set.seed(2) 
c1 <- sort(sample(round(runif(10,1,10)*10), 10 , replace = TRUE)) 
c2 <- sample(c("A", "C", "T"), 10, replace = TRUE) 
c4 <- round(runif(10)*1000) 
d1 <- c(5, 12, c1, 96, 97, 98, 100) 
d2 <- c("B", "C", c2, "B", "T", "T", "A") 
d3 <- c(300, 400, c4, 200, 300, 300, 100) 
dcat2 <- c(sample(1:2, 14, replace = TRUE), 1,1) 

mydat <- data.frame(time = d1, category = d2, category2 = dcat2 , inventory = d3) 
print(mydat) 
#  time category category2 inventory 
# 1  5  B   2  300 
# 2 12  C   1  400 
# 3 27  C   1  10 
# 4 52  C   1  165 
# 5 59  T   2  810 
# 6 62  A   2  869 
# 7 62  C   2  514 
# 8 73  C   1  627 
# 9 85  A   2  844 
# 10 95  C   2  285 
# 11 95  T   1  667 
# 12 95  A   1  150 
# 13 96  B   2  200 
# 14 97  T   2  300 
# 15 98  T   1  300 
# 16 100  A   1  100 

require(ggplot2) 
p <- ggplot(data=mydat, aes(x = time, y = inventory, group = category, col = category)) + 
    geom_step() + 
    facet_grid(.~category2) 
print(p) 
q <- ggplot(data=mydat, aes(x = time, y = inventory, group = category, col = category)) + 
    geom_step() + 
    facet_grid(.~category2) + 
    coord_cartesian(xlim = c(80,98)) 
print(q) 

Этот участок работает, но так как мои реальные данные настолько велики, что нужно навсегда сюжет. Я хотел бы также ступенчатого участка следует считать, чтобы начать с нуля в момент времени = 0 и удерживать последнее значение не было до времени = 100, вместо того, чтобы просто исчезнуть и не появляться из ниоткуда, как это делает в p и q

Следующее в большей степени соответствует тому, что я пытаюсь сделать. Это дает ошибку, так что мне нужно будет обернуть кадр mydat.zoom данных с использованием самых последних наблюдений (раньше), и последнее наблюдение изнутри mydat.zoom (после), для каждого взаимодействия категории и category2

require(dplyr) 

mydat.zoom <- filter(mydat, time >80, time < 98) 
r <- ggplot(data=mydat.zoom, aes(x = time, y = inventory, group = category, col = category)) + 
    geom_step() + 
    facet_grid(.~category2) 

print(r) дает оценку ошибка, потому geom_step требует, по крайней мере, 2 точки, когда графики в гранях, но некоторые из них были отрезаны Подменят до времени между 80 и 98.

Просьбы предложить эффективный способ поиска, для каждого фактора, то последнее наблюдение перед окном масштабирования и способ скопировать последнее наблюдение и обернуть окно масштабирования в них (или другое решение!)

+0

«c3», как представляется, отсутствует. – steveb

+0

Я решил решить эту проблему с тех пор, но не успел вернуться к моему вопросу, чтобы добавить решение. Я использовал пакет data.table (возможно, использовал dplyr), но решение, приведенное ниже, эффективно решает проблему. require (data.table) mydat.zoom <- rbind (mydat [время <80, .SD [.N], by =.(категория1, категория2)], mydat [время> = 80 и время hi, 98], mydat [время> 98, .SD [1], by =. (category1, category2)]) – user5364303

ответ

0

Хорошо, это взломать, но это может помочь вам преодолеть эту проблему на данный момент (т. пока кто-то не предоставит более чистое решение).

Это создает временную переменную, содержащую счетчик возникновения каждого фактора. Затем результат фильтруется для обеспечения не менее 2 точек данных.

mydat.zoom <- 
    filter(mydat, time >80, time < 98) %>% # Your current filtering 
    group_by(category2)    %>% # Using cat2 for this example 
    mutate(cat2_cnt = n())    %>% # count to be filtered on 
    filter(cat2_cnt > 1)    %>% # Ensure >= 2 data points 
    ungroup       %>% # Don't need grouping. 
    select(-fcnt)       # Don't need column anymore 

Нечто подобное может работать на вас.

РЕДАКТИРОВАТЬ:

Лучшее решение с использованием dplyr, чем один выше с временной переменной.

mydat.zoom <- 
    filter(mydat, time >80, time < 98) %>% # Your current filtering 
    group_by(category2)    %>% # Using cat2 for this example 
    filter(n() > 1)     %>% # Ensure >= 2 data points 
    ungroup         # Don't need grouping. 
+0

благодарит за ваш ответ! Я хотел включить наблюдения, которые произошли только раз в этот период. Я решил проблему, с которой я работал с тех пор, как я ее разместил, и включил ее в другой комментарий для тех, кто ищет ту же проблему – user5364303

1

Вот метод, который я использовал, чтобы принести прошлые наблюдения вперед в окно времени рассматривается:

require(data.table) 
myDT <- as.data.table(mydat) 
preDT <- myDT[ time < 80, .SD[.N] , by = .(category, category2)] # for each category/category2 interaction before time =80, take the last observation 
mydat.zoom <- rbind(preDT, myDT[ time >= 80 & time <= 98]) # gives everything from time = 80 to time =98 and the last observation for each thing that happened before time = 80 
Смежные вопросы