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

问题描述

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

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

基于每个站点中的先前部署,我想生成一个新列,指示给定 bearingant 是否与先前部署中的不同 ant 编号相关联.具体来说,我想知道 ant bearing 何时切换(例如 ant 2 WAS 在 60 度但现在是 120 而 ant 3 是 120 但现在是60 度)。例如

site = c(rep(1,3))
switched = c(rep(F,13),T)
df = data.frame(site,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,向量 c(90,60,120) 中包含 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