2017-05-30 123 views
0

我有兩個數據幀(df1,df2),其中包含大致相同時間段但不同時間戳的一些測量值。 df1具有每小時數據,df2具有每小時有2-3次測量的數據。我想:R中的時間戳算術運算

  1. 爲DF2每小時平均水平進行比較,以DF即一個值每小時從每個數據幀中的小時值

  2. 創建DF2一個新元素(DF2 $小時一次),這具有等於​​從DF1在每小時DF2即2-3值中的每個時戳每小時值的值(取決於沒有。在DF2時間戳相應小時的)

subsetfilter不要這種情況真的沒有用 - 我不想使用循環。我正在考慮使用strftimeaggregate - 有沒有更好的方法來做到這一點?我正在學習data.table軟件包 - 也許有更快/更方便的方法?

這裏是DF1和DF2的樣子:

> glimpse(df1) 
Observations: 7,770 
Variables: 7 
$ lat  <dbl> 30.46198, 30.46198, 30.46198, 30.46198, 30.46198, 30.... 
$ lon  <dbl> -91.17922, -91.17922, -91.17922, -91.17922, -91.17922... 
$ date_gmt <chr> "2016-01-01", "2016-01-01", "2016-01-01", "2016-01-01... 
$ time_gmt <chr> "06:00", "07:00", "08:00", "09:00", "10:00", "11:00",... 
$ dust  <dbl> 10.7, 8.0, 8.3, 11.1, 9.1, 10.5, 9.7, 13.5, 10.5, 10.... 
$ state <chr> "Louisiana", "Louisiana", "Louisiana", "Louisiana", "... 
$ tme  <dttm> 2016-01-01 06:00:00, 2016-01-01 07:00:00, 2016-01-01... 

df1$tmePOSIxct對象(tz = "GMT"

> glimpse(df2) 
Observations: 5,000 
Variables: 9 
$ dp1  <dbl> 0.96, 0.97, 0.98, 0.99, 0.99, 0.99, 0.99, 0.99, 0.9... 
$ dp2  <dbl> 1.51, 1.53, 1.55, 1.56, 1.56, 1.56, 1.56, 1.56, 1.5... 
$ hz   <dbl> 54.13, 54.55, 54.91, 55.03, 54.98, 55.00, 55.13, 55... 
$ rh   <dbl> 68.15, 68.56, 69.84, 68.32, 69.62, 71.14, 70.42, 70... 
$ degc  <dbl> 82.88, 82.33, 82.26, 82.62, 82.20, 81.60, 82.05, 81... 
$ cfm  <dbl> 3993, 3990, 3989, 3928, 3967, 4045, 4002, 3979, 403... 
$ dust  <dbl> 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.0... 
$ time_stamp <dttm> 2016-06-01 17:48:10, 2016-06-01 18:08:12, 2016-06-... 
$ dur  <dbl> 0.0000000, 0.3338889, 0.6677778, 1.0013889, 1.33555... 

df2$time_stampPOSIxct對象(tz = "EST"

+3

的'glimpse'不是一個問題非常有幫助的,因爲別人無法複製並粘貼到自己的會話 –

回答

1

,因爲我沒有有測試數據,這是我能做的最好的。希望它有效。

我假設你想比較灰塵變量(只在你的數據框中的公共變量)。我還假設比較意味着你只想看三角洲。

步驟:

  1. 確保您的時區是相同的
  2. 將您的時間戳,以每小時數據
  3. 按小時時間
  4. 合併計算你的變量/秒的平均基於時間戳
  5. 計算您的比較的三角洲

TESTDATA:

library(data.table) 
df1<-data.table(tme=seq.POSIXt(as.POSIXct("2016-01-01 00:00",tz="GMT"),by=3600, length.out = 100),dust=rnorm(100)) 
df2<-data.table(matrix(rnorm(1000*8),1000,8)) 
setnames(df2, c("dp1","dp2", "hz","rh","degc", "cfm", "dust","dur")) 
df2[,time_stamp:=seq.POSIXt(as.POSIXct("2016-01-01 00:00",tz="EST"),by=360, length.out = 1000)] 

dplyr::glimpse(df1) 
dplyr::glimpse(df2) 

代碼:

#first snippet 
attr(df2$time_stamp,"tzone")<-"GMT" #make same timezone 
df2[, tme:=lubridate::round_date(time_stamp, unit = "hours")] #make hourly timestamps 
df3<-df2[, mean(dust), by=c("tme")] #group by tme I am assuming you want to compare the only common variable dust 
setnames(df3, c("tme","dustmean")) 
df_compare<-merge(df1, df3, by="tme", all=T) #this will include all observations from both data.tables 
df_compare[,delta_dust:=dust-dustmean] #is that what you want as comparison? 
plot(df_compare$delta_dust) 

代碼2: 對於所有的變量(列)與EST時間和round_date代替。

#second snippet 
attr(df1$tme,"tzone")<-"EST" #make same timezone 
df2[, tme:=lubridate::round_date(time_stamp, unit="hours")] #make hourly timestamps 
cols2mean<-colnames(df2) 
cols2mean<-cols2mean[!(cols2mean %in% c("tme", "time_stamp"))] 
df3<-df2[, lapply(.SD, mean), by=c("tme"), .SDcols=cols2mean] #all variables except tme and time_stamp 
df_compare<-merge(df1, df3, by="tme", all=T) #this will include all observations from both data.tables 
df_compare[,delta_dust:=dust.x-dust.y] #one example 
plot(df_compare$delta_dust) 
+0

在我的劇本我用'格式(DF1 $ TME,TZ =「EST」,usetz = TRUE)'確保它們是同一時間,我使用'round(df1 $ tme,units =「hours)'',因爲秒數與此分析無關 儘管我的第1部分的平均灰塵值是好的問題,它沒有回答問題的第2部分,還有其他列(用於執行一些計算) 我真的應該改進我對data.table操作的理解。 – Gautam

+0

@Marwaha哪列是你的需要?所有這些? – user3293236

+0

基本上,對於df2中的每個時間戳,我想要使用四捨五入'time_stamp'的值並用它從df2中找到相應的值 - 類似於'subset(df1,tme == round(df2 $ time_stamp [i],units =「hours」)%>%select(dust)'where 'i'對應於循環中的當前步驟(對於(i in 1:nrow(df2))' – Gautam