Я немного новичок в R и только начал использовать его для построения графиков.
У меня есть этот код:
times=integer(nrow(df));
for(i in 1:nrow(df)) {
time=df[i+1,4]-df[i,4];
times[i]<-time
}
Должен быть более умный способ сделать это без предварительной инициализации, не так ли?
Я не уверен, но я ищу что-то вроде:
times <- for(i in 1:nrow(df)) yield df[i+1,4]-df[i,4]
(я знаю, что это не правильный код :))
Я надеюсь, что этот вопрос еще не задан. Я искал и не нашел ничего конкретного о "yield" и инициализации массивов.
По запросу ....
Пример данных в формате df:
7926 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7927 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7928 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7929 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7930 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7931 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7932 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7933 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7934 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7935 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7936 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7937 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
7938 08:00:27:ed:f3:e5 MESSAGEHANDLER START 1.319242e+12
7939 08:00:27:ed:f3:e5 MESSAGEHANDLER END 1.319242e+12
После того, как мой цикл раз:
[7921] 508 500 497 501 466 502 505 500 488 501 500 501 490 501 478 501 501 501
[7939] NA
Хорошо, чтобы получить более конкретное, я действительно хочу сделать следующее:
times1=integer(nrow(df));for(i in 1:nrow(df)) { if (df[i,3] == "START") times1[i]<-df[i+1,4]-df[i,4]}
times2=integer(nrow(df));for(i in 1:nrow(df)) { if (df[i,3] == "END") times2[i]<-df[i+1,4]-df[i,4]}
Тогда вывод будет похож на times1:
[7921] 0 500 0 501 0 502 0 500 0 501 0 501 0 501 0 501 0 501
[7939] 0
Но мне нужно:
[3960] 500 501 502 500 501 501 501 501 501
На словах:
Я анализирую измеренные данные из файла CSV, который попадает в df, как показано выше.
Это для «СТАРТ», за которым следует «КОНЕЦ»
Данные в df описывают, что пакет был получен при наличии «START» в df [, 3] в определенное время unix в миллисекундах в df [, 4].
Теперь мне нужно рассчитать время, прошедшее с момента получения до отправки (это время, когда моей машине нужно проанализировать ПОЛУЧЕННЫЙ ПАКЕТ и вычислить результат, чтобы ОТПРАВИТЬ его).
Таким образом, END в df [, 3] означает, что пакет был успешно отправлен в unixtime df [, 4].
Другой случай - «END», за которым следует «START»
Это время, которое прошло между «мой пакет был отправлен» и новый «был получен».
Теперь я добавляю образец csv и мой полный код для воспроизведения:
#load csv in df!
df = read.csv("/tmp/measure.csv",FALSE)
absolute=integer(nrow(df));for(i in 1:nrow(df)) {time=df[i,4]-df[1,4];absolute[i]<-(time/1000)}
times=integer(nrow(df));for(i in 1:nrow(df)) {time=df[i+1,4]-df[i,4];times[i]<-time}
#plot(absolute,times)
plot(absolute,times,lty=1,pch=1,col="#11223399",type="l")
lines(absolute,array(mean(times,na.rm=1),nrow(df)),col="red")
Вот мой показатель .csv:
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238175202
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238175690
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238176195
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238176665
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238177167
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238177669
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238178172
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238178639
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238179139
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238179658
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238180161
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238180654
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238181154
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238181669
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238182170
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,START,1319238182629
08:00:27:ed:f3:e5,TMCMESSAGEHANDLER,END,1319238183130
Надеюсь, это прояснит ситуацию.