连续评估条件,如果满足条件,则返回特定值

时间:2020-01-22 02:24:14

标签: r dataframe

因此,我对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所适合的期间名称中返回行值。

谢谢!

1 个答案:

答案 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)