我有两个数据集,我想根据最近的时间和条件值进行插值。
我想混合数据集A
df.a <- read.table(text=
'"Time1","Var1","User"
2016-06-05 21:08:38,a,1
2016-06-06 10:47:34,b,1
2016-06-06 11:27:07,a,2
2016-06-06 14:49:05,b,2'
, header=TRUE, sep=",")
是:
Time1 Var1 User
2016-06-05 21:08:38 a 1
2016-06-06 10:47:34 b 1
2016-06-06 11:27:07 a 2
2016-06-06 14:49:05 b 2
和数据集B
df.b <- read.table(text=
'"Time2", "Var2", "User"
2016-06-06 08:08:52,x,1
2016-06-06 08:40:51,x,1
2016-06-06 09:17:52,y,1
2016-06-06 09:28:23,y,1
2016-06-06 10:49:57,z,1
2016-06-06 11:07:24,z,1
2016-06-06 11:58:49,x,2
2016-06-06 12:03:14,y,2
2016-06-06 14:53:09,z,2
2016-06-06 15:12:05,z,2'
, header=TRUE, sep=",")
是:
Time2 Var2 User
2016-06-06 08:08:52 x 1
2016-06-06 08:40:51 x 1
2016-06-06 09:17:52 y 1
2016-06-06 09:28:23 y 1
2016-06-06 10:49:57 z 1
2016-06-06 11:07:24 z 1
2016-06-06 11:58:49 x 2
2016-06-06 12:03:14 y 2
2016-06-06 14:53:09 z 2
2016-06-06 15:12:05 z 2
这样我就可以获得数据集B,其中匹配日期与数据集A最接近,其中a$User
== b$User
。
Time2 Var2 User Time1 Var1
2016-06-06 08:08:52 x 1 2016-06-05 21:08:38 a
2016-06-06 08:40:51 x 1 2016-06-05 21:08:38 a
2016-06-06 09:17:52 y 1 2016-06-05 21:08:38 a
2016-06-06 09:28:23 y 1 2016-06-05 21:08:38 a
2016-06-06 10:49:57 z 1 2016-06-06 10:47:34 b
2016-06-06 11:07:24 z 1 2016-06-06 10:47:34 b
2016-06-06 11:58:49 x 2 2016-06-06 11:27:07 a
2016-06-06 12:03:14 y 2 2016-06-06 11:27:07 a
2016-06-06 14:53:09 z 2 2016-06-06 14:49:05 b
2016-06-06 15:12:05 z 2 2016-06-06 14:49:05 b
这需要条件匹配:最小时差,其中a$user
== b$user
我能得到的最接近的是一个交叉连接,但这并不适用于原始数据集,其中A = 300万条记录,B = 2000万条记录
答案 0 :(得分:0)
首先,首先将所有日期和时间数据转换为适当的格式。
df.a$Time1 <- as.POSIXct(df.a$Time1)
df.b$Time2 <- as.POSIXct(df.b$Time2)
现在从df.a
中的长数据转到宽数据,并使用并合并到df.b
。我们从长到宽的数据中选择df.a
到reshape
,因为它是较小的数据集。
df.a.w <- reshape(df.a, idvar = 'User', timevar = 'Var1', direction = 'wide')
df <- merge(df.b, df.a.w, by = 'User', all.x = T)
现在合并数据后,您可以继续使用R中的dplyr
和tidyr
软件包。它们可以用来管理和纠缠数据。
df.l <- data.frame(df %>% gather(TimeType, Time1,-User, -Var2, -Time2) %>%
separate(TimeType, into = c('TimeL', "Var1"), sep = "\\.") %>%
select(-TimeL) %>%
filter(Time2 > Time1) %>%
group_by(User, Time2, Var2) %>%
slice(which.min(Time2-Time1)))
这里我们以data.frame格式获取您请求的数据。使用data.table
可能有更好的解决方案,但我对该包不太好。