【问题标题】:Identify if the position of a value changes relative to it's previous association确定一个值的位置是否相对于它之前的关联发生了变化
【发布时间】:2021-05-01 22:11:06
【问题描述】:

我有一个按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 编号相关联。具体来说,我想知道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() 函数的一些组合来查看是否可以根据轴承的位置创建条件,但到目前为止,还没有任何运气。

提前致谢!

【问题讨论】:

  • 我想我大致了解您要查找的内容,但仍不确定。首先您能否澄清port 是否是天线(ant)?其次,对于 2014 年 8 月 11 日的 site 1,bearing 似乎发生了变化,从 120 --> 60 (port 2) 和 240 --> 360 (port 3) - 应该算作switched?第三,如果一个部署中只有一个port 发生变化,这算作switched 吗?
  • 看这个的一个初步想法是arrange(例如,dplyr)并在给定的siteport内按日期排序(siteport 而不是deploy.id)。然后,如果日期是按顺序排列的,可以将bearing与之前的(lag)方位进行比较以检测变化,并查看switched是否。
  • 嗨@Ben。感谢您的帮助。1) 我已经编辑了帖子,但是是的,portant 相同。在我的实际数据集中port 代表天线。 2) 好问题,我没有这么想过。在新专栏中,我试图识别天线编号被记录为错误方位的情况,而不是方位更改为新方向的情况。因此,在第 4、5 和 6 行的 site 1 处,方位发生了变化,但方向与之前在该站点(第 1、2、3 行)的部署不同,因此 switched 将是 FALSE
  • 3) 是的。理想情况下,如果任何一个ant 与之前部署中的任何其他ant 具有相同的方位,则switched 应该是TRUE

标签: r dataframe logical-operators


【解决方案1】:

这可能值得一试,使用 dplyr 包。

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

同意按sitedeploy.id 进行分组,因为您要考虑此特定组中的所有bearing 值。

如果以下两个都是TRUE,则可以将switched设置为逻辑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 

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多