簡體   English   中英

如何 select 存在所有序列的所有 id 行?

[英]How to select all id's rows where all sequence is present?

我有一個如下的數據表:

DT1 <- data.table(
  id=c(1,1,1,2,2,2,1,1),
  sensor_id=c(1,2,3,1,2,3,2,3),
  time=c("2017-01-01 00:00:05","2017-01-01 00:06:35","2017-01-01 00:23:44","2017-01-02 22:00:20","2017-01-02 22:01:09","2017-01-02 22:28:02","2017-01-03 22:23:01","2017-01-03 22:50:52")
  )

由此,在這種情況下,我想 select 所有 customer_id 行具有傳感器 id (1,2,3) 的所有序列。

所以我想 label 這些如下:

DT1 <- data.table(
  id=c(1,1,1,2,2,2,1,1),
  sensor_id=c(1,2,3,1,2,3,2,3),
  time=c("2017-01-01 00:00:05","2017-01-01 00:06:35","2017-01-01 00:23:44","2017-01-02 22:00:20","2017-01-02 22:01:09","2017-01-02 22:28:02","2017-01-03 22:23:01","2017-01-03 22:50:52"),
  group=c(1,1,1,2,2,2,3,3),
  seq_boolean=c(1,1,1,1,1,1,0,0)
)

我可以在哪里識別該行是否具有所有序列。 一個id可以出現多次,也可以不包含所有序列。

所以為此,我嘗試了下面的先分組

DT1[,group:=rleid(id),by=list(id,rleid(sensor_id))]

但這只是將所有內容組合為一個。 我不確定我在哪里做錯了。 任何幫助表示贊賞。

編輯我也可以有如下格式的數據表。

DT1 <- data.table(
       id=c(1,2,1,2,1,2,1,1),
       sensor_id=c(1,1,2,2,3,3,2,3),
       time=c("2017-01-01 00:00:05","2017-01-01 00:06:35","2017-01-01 00:23:44","2017-01-02 00:00:20","2017-01-02 00:35:09","2017-01-02 00:28:02","2017-01-03 00:45:01","2017-01-03 00:50:52")
   )

這里該組由 sensor_id 定義。sensor_id 1 是 session 的開始,sensor_id 2 是中間 session 和 sensor_id 3 是 Z21D6F40CFB511982E457AE025724 的結尾。 一個 id 可以有多個會話,並且某些傳感器可能無法捕獲該 id。 所以我的目的是識別所有 3 個傳感器 ID 捕獲的所有會話,並查看捕獲了多少。

我們可以檢查每個組是否存在所有uniq_sensor

uniq_sensor <- unique(DT1$sensor_id)
DT1[, seq_boolean := +(all(uniq_sensor %in% sensor_id)), rleid(id)]
DT1

#   id sensor_id                time seq_boolean
#1:  1         1 2017-01-01 00:00:05           1
#2:  1         2 2017-01-01 00:06:35           1
#3:  1         3 2017-01-01 00:23:44           1
#4:  2         1 2017-01-02 22:00:20           1
#5:  2         2 2017-01-02 22:01:09           1
#6:  2         3 2017-01-02 22:28:02           1
#7:  1         2 2017-01-03 22:23:01           0
#8:  1         3 2017-01-03 22:50:52           0

我們還可以計算每個組的唯一傳感器的長度:

DT1[, seq_boolean := +(uniqueN(sensor_id) == length(uniq_sensor)), rleid(id)]

編輯

對於我們要確保sensor_id以完全相同的順序出現的其他條件,我們可以執行以下操作:

library(dplyr)

DT1 %>%
  group_by(id) %>%
  group_by(grp = cumsum(c(TRUE, diff(sensor_id) <= 0)), .add = TRUE) %>%
  #Use add = TRUE for old dplyr < 1.0.0
  mutate(seq_boolean = +(all(uniq_sensor %in% sensor_id)))
DT1[,seq_boolean := +setequal(sensor_id, DT1[, sensor_id]), by = rleid(id)]
DT1
   id sensor_id                time seq_boolean
1:  1         1 2017-01-01 00:00:05           1
2:  1         2 2017-01-01 00:06:35           1
3:  1         3 2017-01-01 00:23:44           1
4:  2         1 2017-01-02 22:00:20           1
5:  2         2 2017-01-02 22:01:09           1
6:  2         3 2017-01-02 22:28:02           1
7:  1         2 2017-01-03 22:23:01           0
8:  1         3 2017-01-03 22:50:52           0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM