簡體   English   中英

R:按組,檢查是否對於一個var的每個唯一值,至少有一個觀察值,其中var的值等於另一個var的值

[英]R: By group, check if for each unique value of one var, there is at least one observation where the value of the var equals the value of another var

我認為我的代碼方向正確,但我還沒到那里。

我嘗試在Google和SE上找到一些有用的東西,但我似乎無法以一種讓我得到我正在尋找的答案的方式來表達問題。

可以寫一個for循環為此,每個ID每行每一個獨特的值進行比較,但我力爭實現R-理解更高的水平,從而希望避免環路。

id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
a <- c(1,1,1,2,2,2,3,3,4,4,4,5,5,5,6)
b <- c(1,2,3,3,3,4,3,4,5,4,4,5,6,7,8)

require(data.table)
dt <- data.table(id, a, b)

dt
dt[,unique(a) %in% b, by=id]
tmp <- dt[,unique(a) %in% b, by=id]
tmp$id[tmp$V1 == FALSE]

在我的例子中, 編號 2,3和5應該是結果,決策規則是:“根據ID,如果有至少一個觀察其中b的值等於是否為一個每個獨特的價值。”

然而,我的代碼僅輸出ID的 2和5,而不是3。這是因為對於ID 3,4與以前的觀察4匹配。

結果應該輸出不滿足條件的ID,或者向原始表添加一個虛擬變量,指示ID是否滿足條件。

怎么樣

dt[, all(sapply(unique(a), function(i) any(a == i & b == i))), by = id]

#   id    V1
#1:  1  TRUE
#2:  2 FALSE
#3:  3 FALSE
#4:  4  TRUE
#5:  5 FALSE

如果要將虛擬變量添加到原始表中,可以像修改它一樣進行修改

dt[, check:=all(sapply(unique(a), function(i) any(a == i & b == i))), by = id]

我想知道我是否可以使用增強的連接功能找到更多的data.table-esk解決方案,這些連接功能是在版本1.9.6中引入data.table (2015年9月19日CRAN)。 使用該版本, data.table已經獲得了連接的能力,而無需使用on參數設置鍵。

變式1

dt[a == b][dt[, unique(a), by = id], on = .(id, a == V1)][is.na(b), unique(id)]
 [1] 2 3 5 

首先,選擇ab相等的dt行。 只有這些行與每個id的唯一值a連接在一起。 連接的結果是

dt[a == b][dt[, unique(a), by = id], on = .(id, a == V1)]
  id ab 1: 1 1 1 2: 2 2 NA 3: 3 3 3 4: 3 4 NA 5: 4 4 4 6: 4 4 4 7: 4 5 5 8: 5 5 NA 9: 5 6 NA 

b列中的NA值表示未找到匹配項。 任何具有NA值的id表示不滿足OP的條件。

變體2

dt[dt[, unique(a), by = id], on = .(id, a == V1, b == V1), unique(id[is.na(x.a)])]
 [1] 2 3 5 

這種變異右連接dt (未過濾!)用的唯一值a對每個id ,但連接條件需要在比賽id在以及匹配ab (這類似於konvas'接受的答案中a == i & b == i表達式。最后,返回那些在連接結果中至少有一個NA值表示缺少匹配的id

暫無
暫無

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

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