问题描述
我有一个按 site
和 deploy.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
基于每个站点中的先前部署,我想生成一个新列,指示给定 bearing
的 ant
是否与先前部署中的不同 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
列中有可用的值,所以您可能已经接近了。
同意按 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,向量 c(90,60,120) 中包含 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