2015-08-17 1 views
0

Таким образом, данные временной метки, которые мы собираем, имеют 19 цифр. Первый способ, которым мы его запускали, мы получаем эти перекрытия, которых не должно быть. Я пытался игнорировать первую десятую цифру и пробовать остальные, но я получаю ошибку. Как я могу отображать его таким образом, чтобы он не перекрывался, а также содержит только продолжительность в минуту, секунды, миллисекунды или около того? потому что все эти эксперименты происходят почти в один и тот же час и дату, поэтому я не хочу показывать избыточные данные.Как разбить метку времени в R для Googlevis без перекрытия

library('googleVis') 
dd <- read.csv("output_2015-08-05-17-07-12_gaze.txt", header = TRUE, sep = ",",colClasses = c('character','character')) 
dd <- within(dd, { 
    end <- as.POSIXct(as.numeric(substr(rosbagTimestamp, 11, 14))/1e9, 
        origin = '1970-01-01') 
    start <- as.POSIXct(as.numeric(substr(rosbagTimestamp, 14, 19))/1e9, 
         origin = '1970-01-01') 
    rosbagTimestamp <- NULL 
}) 

## sum the times by group 
dd1 <- aggregate(. ~ data, data = dd, sum) 
dd1 <- within(dd1, { 
    start <- as.POSIXct(start, origin = '1970-01-01') 
    end <- as.POSIXct(end, origin = '1970-01-01') 
}) 


plot(gvisTimeline(dd1, rowlabel = 'data', barlabel = 'data', 
        start = 'start', end = 'end', options=list(width="600px", height="800px"))) 

enter image description here

Кроме того, один, который показывает час и имеет перекрытие, как это:

dd <- read.csv("output_2015-08-05-17-07-12_gaze.txt", header = TRUE, sep = ",",colClasses = c('character','character')) 
dd <- within(dd, { 
    end <- as.POSIXct(as.numeric(substr(rosbagTimestamp, 1, 10))/1e9, 
        origin = '1970-01-01') 
    start <- as.POSIXct(as.numeric(substr(rosbagTimestamp, 11, 19))/1e9, 
         origin = '1970-01-01') 
    rosbagTimestamp <- NULL 
}) 

## sum the times by group 
dd1 <- aggregate(. ~ data, data = dd, sum) 
dd1 <- within(dd1, { 
    start <- as.POSIXct(start, origin = '1970-01-01') 
    end <- as.POSIXct(end, origin = '1970-01-01') 
}) 
plot(gvisTimeline(dd1, rowlabel = 'data', barlabel = 'data', 
        start = 'start', end = 'end', options=list(width="600px", height="800px"))) 

enter image description here

Вот link to dataset.

ответ

2

Я не уверен, что вы подразумеваете под «перекрытием». Похоже, что данные состоят из монотонно возрастающего набора временных меток, где каждая метка времени помечена какой-то категорией (имена фруктов, по крайней мере, в этих примерах данных). Категории не являются полностью смежными (хотя они, как правило, находятся в коротких отрезках), поэтому, возможно, это то, о чем вы говорите, когда говорите «перекрытие». Но это только характер данных; нет возможности «разбить» временные метки таким образом, чтобы они меняли свое отношение друг к другу. И вы не можете игнорировать некоторые цифры метки времени; что сделало бы данные бессмысленными.

Чтобы уточнить, отметки времени составляют 19 цифр, представляющих числа в базе 10. Цифры относятся к наносекундам, прошедшим с 1970-01-01 UTC. Это общий способ представления временных меток (вместе с секундами с 1970-01-01 UTC, миллисекунды с 1970-01-01 UTC и дни с 1970-01-01 по UTC).

Таким образом, вы можете получить POSIXct представление меток времени с помощью принуждения, чтобы удвоить с помощью as.double() (можно также использовать as.numeric()), разделив на 1e9, а затем с помощью функции принуждения as.POSIXct() с origin='1970-01-01', которая лечит двойные значения в секундах с 1970- 01-01 UTC. (Похоже, что вы делаете что-то близкое к этому в своем коде, но оно не работает из-за вышеупомянутых проблем.)

Теперь вы фактически теряете немного точности при этом, потому что значимость вездесущего двойной тип имеет 53 двоичных разряда (52 явно закодирован в битах значения и 1 неявный (ведущий 1 бит), см. .Machine$double.digits), который работает примерно до 15 базовых 10 цифр. Этого недостаточно, чтобы сохранить все 19 базовых 10 цифр во входящих временных меток. Но, поскольку вам, вероятно, не нужны микросекунды и наносекунды, мы можем игнорировать это здесь.

Я рекомендую data.table для всех настольных работ, поскольку он более изящный, мощный и совершенный, чем базовый тип data.frame. Вот как вы можете вводить и обрабатывать данные с помощью data.table:

## prepare data 
library(data.table); 
dd <- as.data.table(read.csv('~/Desktop/gazedata.csv.txt',header=T,sep=',',colClasses=c('character','character'))); 
dd[,`:=`(dt=as.POSIXct(as.double(rosbagTimestamp)/1e9,origin='1970-01-01'),rosbagTimestamp=NULL)]; 
dd2 <- dd[,.(start=min(dt),end=max(dt)),data][order(data)]; 
dd2; 
##   data    start     end 
## 1:   0 2015-08-05 18:07:14 2015-08-05 18:10:49 
## 2:  apple 2015-08-05 18:08:13 2015-08-05 18:10:48 
## 3: avocado 2015-08-05 18:07:13 2015-08-05 18:10:01 
## 4:  banana 2015-08-05 18:07:16 2015-08-05 18:10:48 
## 5: blueberry 2015-08-05 18:07:14 2015-08-05 18:10:42 
## 6:  kiwi 2015-08-05 18:07:27 2015-08-05 18:10:41 
## 7:  mango 2015-08-05 18:07:17 2015-08-05 18:10:40 
## 8:  orange 2015-08-05 18:07:27 2015-08-05 18:10:30 
## 9:  papaya 2015-08-05 18:07:12 2015-08-05 18:09:16 
## 10:  peach 2015-08-05 18:08:15 2015-08-05 18:10:45 
## 11:  pear 2015-08-05 18:07:20 2015-08-05 18:07:48 
## 12: strawberry 2015-08-05 18:07:14 2015-08-05 18:10:20 
## 13: watermelon 2015-08-05 18:07:30 2015-08-05 18:09:29 

Теперь, что касается построения, то вы не можете пойти по этому пути, но так как данные вы работаете с примитивно данных (т.е. временные метки POSIXct и символьные строки), вы можете построить его самостоятельно, используя базовые графические функции R. Я обычно предпочитаю это, а не используя предварительно расфасованную функцию построения, такую ​​как gvisTimeline(), так как она обеспечивает больший контроль над элементами построения. Но он также требует обширных знаний о базовой графической структуре и обычно требует больше усилий и внимания при написании кода построения.

Вот демо о том, как производить сюжет, который похож на скриншоте:

## helper functions 
trunc <- function(x,...) UseMethod('trunc'); 
trunc.default <- function(x,...) base::trunc(x,...); 
trunc.POSIXt <- function(x,unit='sec',num=1) { u <- sub(perl=T,'(?<=.)s$','',unit); base::trunc.POSIXt(x,u) - as.integer(format(x,c(sec='%S',second='%S',min='%M',minute='%M',hour='%H',day='%d')[u]))%%num*unname(c(sec=1,second=1,min=60,minute=60,hour=3600,day=86400)[u]); }; 

ceiling <- function(x,...) UseMethod('ceiling'); 
ceiling.default <- function(x,...) base::ceiling(x); 
ceiling.POSIXt <- function(x,unit='sec',num=1) { u <- sub(perl=T,'(?<=.)s$','',unit); trunc.POSIXt(x-.Machine$double.base^(as.integer(log2(as.double(x)))-.Machine$double.digits+1L),unit,num) + num*unname(c(sec=1,second=1,min=60,minute=60,hour=3600,day=86400)[u]); }; 

## define plot parameters 
xtick.first <- trunc(min(dd2$start),'hour'); 
xtick.last <- ceiling(max(dd2$end),'hour'); 
xtick <- seq(xtick.first,xtick.last,'10 min'); 
xtick.range <- as.double(difftime(xtick.last,xtick.first,unit='secs')); 
xmin <- xtick.first - xtick.range*20/100; 
xmax <- xtick.last + xtick.range*5/100; 
xlim <- c(xmin,xmax); 
ydiv <- 0:nrow(dd2); 
ytick <- nrow(dd2):1-0.5; 
ymin <- ydiv[1]; 
ymax <- ydiv[length(ydiv)]; 
ylim <- c(ymin,ymax); 
line.grey <- 'grey'; 
bg.grey <- '#dddddd'; 
bg.white <- 'white'; 

## plot 
par(xaxs='i',yaxs='i',mar=c(5,1,1,1)); 
plot(NA,xlim=xlim,ylim=ylim,axes=F,ann=F); 
rect(xmin,(ymax-1):ymin,xmax,ymax:(ymin+1),col=c(bg.white,bg.grey),border=NA); 
with(expand.grid(y=ytick,x=xtick),segments(x,y+0.5,x,y-0.5,col=rep(c(line.grey,bg.white),len=length(ytick)))); 
abline(h=ydiv,lwd=2,col=line.grey); 
abline(v=xlim,lwd=2,col=line.grey); 
barheight <- 0.75; 
with(dd2,rect(start,ytick-barheight/2,end,ytick+barheight/2,col=rainbow(nrow(dd2)),border=NA)); 
xtick.ishour <- c(T,format(xtick[-1],'%M')=='00'); 
text(xtick,0,pos=1,ifelse(xtick.ishour,format(xtick,'%H:%M'),format(xtick,':%M')),font=ifelse(xtick.ishour,2,1),xpd=NA); 
text(xtick.first,ytick,pos=2,dd2[,data]); 
text(dd2[,end],ytick,pos=4,dd2[,data]); 

plot

+0

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

+0

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