确定一个值的位置是否相对于它之前的关联发生了变化

Identify if the position of a value changes relative to it's previous association

我有一个按 sitedeploy.id 分组的数据框。在每个站点内,deploy.id 按时间顺序排列,并在该设备部署期间标识每个天线 (ant) 的方向 (bearing)。 lag 列显示了之前部署中每个 ant 的方位。在我的数据集中,一个部署中的天线数量可以从一到十不等。我生成了一些列,用于标识在每个站点内,每个天线编号的天线角度是否与之前的部署相同,以及之前部署的“deploy.id”是什么。

site = c(rep(1,6),rep(2,9))
deploy.id = c(rep(657,3), rep(755,3), rep(2029,3), rep(2107,3), rep(3732,3))
date = c("2014-04-25", "2014-04-25", "2014-04-25", "2014-08-11", "2014-08-11", "2014-08-11","2014-11-21", "2014-11-21", "2014-11-21", "2015-04-02","2015-04-02","2015-04-02","2016-11-22", "2016-11-22","2017-04-27")
port = c(rep(1:3,5))
bearing = c(0,120,240,90,60,360,90,60,120,90,60,120,90,120,60)
same.angle = c(rep(NA,3), rep(F,3), rep(NA,3), rep(T,3),T,F,F)
lag = c(rep(NA,3),0,120,240, rep(NA,3),90,60,120,90,60,120)
prev.deploy.id = c(rep(NA,3), rep(657,3), rep(NA,3), rep(755,3), rep(2029,3))
df <- data.frame(site, deploy.id, port, date, bearing, lag, same.angle, prev.deploy.id)

df

   site deploy.id  ant       date bearing lag same.angle prev.deploy.id
1     1       657    1 2014-04-25       0  NA         NA             NA
2     1       657    2 2014-04-25     120  NA         NA             NA
3     1       657    3 2014-04-25     240  NA         NA             NA
4     1       755    1 2014-08-11      90   0      FALSE            657
5     1       755    2 2014-08-11      60 120      FALSE            657
6     1       755    3 2014-08-11     360 240      FALSE            657
7     2      2029    1 2014-11-21      90  NA         NA             NA
8     2      2029    2 2014-11-21      60  NA         NA             NA
9     2      2029    3 2014-11-21     120  NA         NA             NA
10    2      2107    1 2015-04-02      90  90       TRUE            755
11    2      2107    2 2015-04-02      60  60       TRUE            755
12    2      2107    3 2015-04-02     120 120       TRUE            755
13    2      3732    1 2016-11-22      90  90       TRUE           2029
14    2      3732    2 2016-11-22     120  60      FALSE           2029
15    2      3732    3 2017-04-27      60 120      FALSE           2029

基于之前在每个站点中的部署,我想生成一个新列,指示给定 antbearing 是否与以前的部署。具体来说,我想知道 ant bearing 何时切换(例如 ant 2 WAS 为 60 度但现在为 120 而 ant 3 为 120 但现在在 60 度)。例如

site = c(rep(1,6),rep(2,9))
deploy.id = c(rep(657,3), rep(755,3), rep(2029,3), rep(2107,3), rep(3732,3))
date = c("2014-04-25", "2014-04-25", "2014-04-25", "2014-08-11", "2014-08-11", "2014-08-11","2014-11-21", "2014-11-21", "2014-11-21", "2015-04-02","2015-04-02","2015-04-02","2016-11-22", "2016-11-22","2017-04-27")
port = c(rep(1:3,5))
bearing = c(0,120,240,90,60,360,90,60,120,90,60,120,90,120,60)
same.angle = c(rep(NA,3), rep(F,3), rep(NA,3), rep(T,3),T,F,F)
lag = c(rep(NA,3),0,120,240, rep(NA,3),90,60,120,90,60,120)
prev.deploy.id = c(rep(NA,3), rep(657,3), rep(NA,3), rep(755,3), rep(2029,3))
switched = c(rep(F,13), T, T)
df = data.frame(site, deploy.id, port, date, bearing, lag, same.angle, prev.deploy.id, switched)

df

   site deploy.id  ant       date bearing lag same.angle prev.deploy.id switched
1     1       657    1 2014-04-25       0  NA         NA             NA    FALSE
2     1       657    2 2014-04-25     120  NA         NA             NA    FALSE
3     1       657    3 2014-04-25     240  NA         NA             NA    FALSE
4     1       755    1 2014-08-11      90   0      FALSE            657    FALSE
5     1       755    2 2014-08-11      60 120      FALSE            657    FALSE
6     1       755    3 2014-08-11     360 240      FALSE            657    FALSE
7     2      2029    1 2014-11-21      90  NA         NA             NA    FALSE
8     2      2029    2 2014-11-21      60  NA         NA             NA    FALSE
9     2      2029    3 2014-11-21     120  NA         NA             NA    FALSE
10    2      2107    1 2015-04-02      90  90       TRUE            755    FALSE
11    2      2107    2 2015-04-02      60  60       TRUE            755    FALSE
12    2      2107    3 2015-04-02     120 120       TRUE            755    FALSE
13    2      3732    1 2016-11-22      90  90       TRUE           2029    FALSE
14    2      3732    2 2016-11-22     120  60      FALSE           2029     TRUE
15    2      3732    3 2017-04-27      60 120      FALSE           2029     TRUE

我已经尝试使用 group_by()which() 函数的一些组合来查看我是否可以根据方位角的位置创建条件,但到目前为止,还没有运气好。

提前致谢!

这可能是值得尝试的,使用 dplyr 包。

如果您想查看 bearing 是否出现在之前的 deploy.id 中,并且您在 lag 列中有可用的值,那么您可能已经接近了。

同意按 sitedeploy.id 分组,因为您想考虑该特定组中的所有 bearing 值。

您可以将 switched 设置为逻辑 TRUE 如果以下两个都是 TRUE:

  1. bearing 包含在 lag 组内(特定于 sitedeploy.id)。使用 %in% 查看 bearing 是否包含在包含所有 lag 值的向量中。例如,对于 deploy.id 755,90 而不是 包含在向量 c(0, 120, 240) 中。但是,对于 deploy.id 3732,120 包含在向量 c(90, 60, 120).

  2. 第二部分是比较同一行中的bearing值和lag值。在这里,对于 deploy.id 3732,90 和 90 是相同的,所以结果是 FALSE。但是,您有 120 != 60 和 60 != 120,因此其他两行将具有 TRUE.

代码

library(dplyr)

df %>%
  group_by(site, deploy.id) %>%
  mutate(switched = bearing %in% lag & bearing != lag)

输出

    site deploy.id  port date       bearing   lag same.angle prev.deploy.id switched
   <dbl>     <dbl> <int> <chr>        <dbl> <dbl> <lgl>               <dbl> <lgl>   
 1     1       657     1 2014-04-25       0    NA NA                     NA FALSE   
 2     1       657     2 2014-04-25     120    NA NA                     NA FALSE   
 3     1       657     3 2014-04-25     240    NA NA                     NA FALSE   
 4     1       755     1 2014-08-11      90     0 FALSE                 657 FALSE   
 5     1       755     2 2014-08-11      60   120 FALSE                 657 FALSE   
 6     1       755     3 2014-08-11     360   240 FALSE                 657 FALSE   
 7     2      2029     1 2014-11-21      90    NA NA                     NA FALSE   
 8     2      2029     2 2014-11-21      60    NA NA                     NA FALSE   
 9     2      2029     3 2014-11-21     120    NA NA                     NA FALSE   
10     2      2107     1 2015-04-02      90    90 TRUE                  755 FALSE   
11     2      2107     2 2015-04-02      60    60 TRUE                  755 FALSE   
12     2      2107     3 2015-04-02     120   120 TRUE                  755 FALSE   
13     2      3732     1 2016-11-22      90    90 TRUE                 2029 FALSE   
14     2      3732     2 2016-11-22     120    60 FALSE                2029 TRUE    
15     2      3732     3 2017-04-27      60   120 FALSE                2029 TRUE