确定一个值的位置是否相对于它之前的关联发生了变化
Identify if the position of a value changes relative to it's previous association
我有一个按 site
和 deploy.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
基于之前在每个站点中的部署,我想生成一个新列,指示给定 ant
的 bearing
是否与以前的部署。具体来说,我想知道 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
列中有可用的值,那么您可能已经接近了。
同意按 site
和 deploy.id
分组,因为您想考虑该特定组中的所有 bearing
值。
您可以将 switched
设置为逻辑 TRUE
如果以下两个都是 TRUE
:
bearing
包含在 lag
组内(特定于 site
和 deploy.id
)。使用 %in%
查看 bearing
是否包含在包含所有 lag
值的向量中。例如,对于 deploy.id
755,90 而不是 包含在向量 c(0, 120, 240) 中。但是,对于 deploy.id
3732,120 是 包含在向量 c(90, 60, 120).
中
第二部分是比较同一行中的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
我有一个按 site
和 deploy.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
基于之前在每个站点中的部署,我想生成一个新列,指示给定 ant
的 bearing
是否与以前的部署。具体来说,我想知道 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
列中有可用的值,那么您可能已经接近了。
同意按 site
和 deploy.id
分组,因为您想考虑该特定组中的所有 bearing
值。
您可以将 switched
设置为逻辑 TRUE
如果以下两个都是 TRUE
:
中bearing
包含在lag
组内(特定于site
和deploy.id
)。使用%in%
查看bearing
是否包含在包含所有lag
值的向量中。例如,对于deploy.id
755,90 而不是 包含在向量 c(0, 120, 240) 中。但是,对于deploy.id
3732,120 是 包含在向量 c(90, 60, 120).第二部分是比较同一行中的
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