因此,我对R有点陌生,我正试图根据一种事实证明我很难弄清一个条件来返回列值!
我有两个正在使用的数据库-一个数据库通常是7万行,每行有一个unix时间数字(我们称其为df1)。另一个提供了多个参与者的开始时间和结束时间(我已经将其转换为Unix时间编号)以及在开始时间和结束时间之间完成的活动名称(让我们说df2)。
我设法将df2过滤为我正在df1中使用的数据的参与者,如下所示:
head(df2, 5)
Name Period.Name Start.Time End.Time Unix.Start.Time Unix.End.Time
27 Name 1 Period 1 17:59:40 18:11:00 1579075181 1579075860
53 Name 1 Period 2 18:11:59 18:15:13 1579075919 1579076114
79 Name 1 Period 3 18:17:55 18:23:22 1579076275 1579076603
96 Name 1 Period 4 18:24:58 18:31:56 1579076699 1579077116
131 Name 1 Period 5 18:37:45 18:45:30 1579077465 1579077930
和df1看起来像这样:
head(df1, 20)
data.point Label Timestamp Name dateCode
1 0 Label 1 1579075180 Name 1 200115
2 1 Label 1 1579075181 Name 1 200115
3 1 Label 1 1579075182 Name 1 200115
4 2 Label 1 1579075183 Name 1 200115
5 2 Label 1 1579075184 Name 1 200115
6 2 Label 1 1579075185 Name 1 200115
7 1 Label 1 1579075186 Name 1 200115
8 1 Label 1 1579075187 Name 1 200115
9 1 Label 1 1579075188 Name 1 200115
10 3 Label 1 1579075189 Name 1 200115
11 3 Label 1 1579075190 Name 1 200115
12 3 Label 1 1579075191 Name 1 200115
13 3 Label 1 1579075192 Name 1 200115
14 4 Label 1 1579075193 Name 1 200115
15 4 Label 1 1579075194 Name 1 200115
16 4 Label 1 1579075195 Name 1 200115
17 2 Label 1 1579075196 Name 1 200115
18 2 Label 1 1579075197 Name 1 200115
19 1 Label 1 1579075198 Name 1 200115
20 0 Label 1 1579075199 Name 1 200115
我正在尝试在df1中创建一个新列,如果df1 $ Timestamp值介于df2 $ Unix.Start.Time和df2 $ Unix.End.Time之间,则从df2 $ Period.Name返回相应的期间名称。像这样:
data.point Label Timestamp Name dateCode Period
1 0 Label 1 1579075180 Name 1 200115 Null
2 1 Label 1 1579075181 Name 1 200115 Period 1
3 1 Label 1 1579075182 Name 1 200115 Period 1
4 2 Label 1 1579075183 Name 1 200115 Period 1
5 2 Label 1 1579075184 Name 1 200115 Period 1
6 2 Label 1 1579075185 Name 1 200115 Period 1
7 1 Label 1 1579075186 Name 1 200115 Period 1
8 1 Label 1 1579075187 Name 1 200115 Period 1
9 1 Label 1 1579075188 Name 1 200115 Period 1
10 3 Label 1 1579075189 Name 1 200115 Period 1
...
1001 3 Label 1 1579075916 Name 1 200115 Null
1002 3 Label 1 1579075917 Name 1 200115 Null
1003 3 Label 1 1579075918 Name 1 200115 Null
1004 4 Label 1 1579075919 Name 1 200115 Period 2
1005 4 Label 1 1579075920 Name 1 200115 Period 2
1006 4 Label 1 1579075921 Name 1 200115 Period 2
1007 2 Label 1 1579075922 Name 1 200115 Period 2
1008 2 Label 1 1579075923 Name 1 200115 Period 2
1009 1 Label 1 1579075924 Name 1 200115 Period 2
1010 0 Label 1 1579075925 Name 1 200115 Period 2
这个过程每周完成几次,每次两个数据帧的长度都不同,时间戳也不同。
我已经尝试过ifelse函数,但是还无法弄清楚如何评估所有df2 Unix时间点上的df1 $ Timestamp值,并从df1 $ Timestamp所适合的期间名称中返回行值。
谢谢!
答案 0 :(得分:0)
尝试使用fuzzy_.*_join
软件包中的fuzz_join
:
fuzzyjoin::fuzzy_inner_join(df1, df2,
by = c('Name' = 'Name', 'Timestamp' = 'Unix.Start.Time',
'Timestamp' = 'Unix.End.Time'), match_fun = list(`==`, `>=`, `<=`))
或者您可以尝试使用标准联接,然后尝试filter
值,这些值可以在基本R中完成
subset(merge(df1, df2, by = 'Name'),
Timestamp >= Unix.Start.Time & Timestamp <= Unix.End.Time)
或dplyr
library(dplyr)
inner_join(df1, df2, by = 'Name') %>%
filter(Timestamp >= Unix.Start.Time & Timestamp <= Unix.End.Time)