根据R中最近的日期插值数据

时间:2016-06-21 13:08:16

标签: r

我有两个数据集,我想根据最近的时间和条件值进行插值。

我想混合数据集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万条记录

1 个答案:

答案 0 :(得分:0)

首先,首先将所有日期和时间数据转换为适当的格式。

df.a$Time1 <- as.POSIXct(df.a$Time1)
df.b$Time2 <- as.POSIXct(df.b$Time2)

现在从df.a中的长数据转到宽数据,并使用并合并到df.b。我们从长到宽的数据中选择df.areshape,因为它是较小的数据集。

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中的dplyrtidyr软件包。它们可以用来管理和纠缠数据。

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可能有更好的解决方案,但我对该包不太好。