2017-12-29 28 views
1

マージしようとしているデータフレームが2つあります(d1small)。私は各データフレームをエクスポートして、hereを利用可能にしました。dplyrでPOSIXctオブジェクトのfull_joinにエラーが発生しました

d1データフレームは、smallデータフレームを生成するために使用されました。私は、一連のfor ifループを使用して、を作成し、smallデータセットを生成するためにd1データセットの各種(sps)の有無を(2時間のビンで)決定しました。

私はこのような何かを得るためにd1で(仮想的な例を)それらをsmallからTRUE/FALSE行を取ると、マージされてやろうとしています:

  datetime  MUVI80 MUXX80 MICRO80 TAHU80 TAST80 ERDO80 LEAM80 ONZI80 MEME80 MAMO80 sps pp  datetime  km crossingtype 
1 2012-06-19 01:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE MICRO 0 2012-06-19 02:19 80 Exploration 
2 2012-06-21 21:42:00 FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE MUXX 1 2012-06-21 23:23 80  Unknown 
3 2012-07-15 09:42:00 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE MAMO 0 2012-07-15 11:38 80  Complete 
4 2012-07-20 21:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE MICRO 0 2012-07-20 22:19 80 Exploration 
5 2012-07-29 21:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE MICRO 0 2012-07-29 23:03 80 Exploration 
6 2012-08-08 23:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE MICRO 0 2012-08-07 02:04 80  Complete 

両方のデータセットは、共通のフィールドdatetimeを共有しながら、それらは異なるフォーマットされており、これは、2つの理由のために問題を引き起こしている:

  1. datetimeフィールドはにPOSIXctオブジェクトでありますですが、d1にはありません。
  2. smalldatetimeフィールドを作成するには、2時間のタイムビンも作成しました(つまり、2時間以内に種が存在していた(TRUE)または不在(FALSE))。つまり、フィールドは、smalld1データセットの間で完全に一致しません。むしろdatetimeフィールドのd1は、フィールドの2時間以内のどこでもsmallになります。
  3. したがって

、私は試してみてください。

time<-dplyr::full_join(small, d1, by = "datetime") 

それは明らかに動作しません。次のように

私が手にエラーがある:

Error in full_join_impl(x, y, by$x, by$y, suffix$x, suffix$y, check_na_matches(na_matches)) : cannot join a POSIXct object with an object that is not a POSIXct object 

誰がどのように私ができる上の任意の提案を持っています:

  1. が異なるdatetimeフィールドがであり、その後にそれらを強制フォーマットどのようなチェックを同じフォーマット。
  2. datetimeフィールドに時間の不一致があっても、これら2つのデータセットをマージします。
+0

両方のデータセットを共有できますか? – suchait

答えて

2

パッケージは、rangeベースのdata.frameとテーブルの結合でシナリオを処理する柔軟性を提供します。 OPで述べた問題を解決するためにsqldfを使用する方法を示してみましょう。

I started with reading data from files shared in OP. 

library(sqldf) 

# Read the data from d1.txt. Pretty straight forward. 
d1 <- read.table("d1.txt", header = TRUE, stringsAsFactors = FALSE) 

# The datetime column is character. Hence change it to POSIXct 
d1$datetime <- as.POSIXct(d1$datetime) 

# small.txt file doesn't contain datetime together. Need to introduce 
# another column as onlytime to read time part separately. 
small <- read.table("small.txt", header = TRUE, stringsAsFactors = FALSE) 

# merge onlytime part with date part in datetime column 
small$datetime = paste(small$datetime, small$onlytime, sep = " ") 
# drop column onlytime 
small$onlytime <- NULL 
# Now datetime column is character. Hence change it to POSIXct 
small$datetime <- as.POSIXct(small$datetime) 

# everything is ready now. Lets join two dataframes 
# small$datetime is at 2 hours interval and represent data for past 2 hours 
# Hence range matching records to be found within 2 hours(2*60*60) before and 
# time of current row 

time = sqldf("select * from d1 
       inner join small 
       on d1.datetime between (small.datetime - 2*60*60) and small.datetime") 


head(time, 3) 
    ID  date sps time pp   datetime km crossingtype   datetime MUVI80 MUXX80 MICRO80 TAHU80 TAST80 ERDO80 LEAM80 ONZI80 
1 15185 2012-10-22 MICRO 3:42 0 2012-10-22 03:42:00 80  Unknown 2012-10-22 03:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
2 15187 2012-10-23 MICRO 0:40 0 2012-10-23 00:40:00 80  Unknown 2012-10-23 01:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
3 17018 2012-10-29 MICRO 21:03 0 2012-10-29 21:03:00 80  Unknown 2012-10-29 21:42:00 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 

OPの実際のオブジェクトに合わせて結合タイプを変更することができます。

+1

これは完璧です。それは私が必要とするものを正確に行います。明確な答えをありがとう! –

関連する問題