![](/img/trans.png)
[英]R: File format for a data.table with a column containing vectors as elements
[英]Comparing vectors of multiple column values in R data.table
在以下示例中:
DT <- data.table(A1=c(1,2),A2=c(2,3),B1=c(1,2),B2=c(3,4),B3=c(2,5))
我想檢查每一行是否A1和A2列中的值都出現在B1,B2或B3中。
如果我做:
DT[,BOTH_PRESENT:=!(F %in% (c(A1,A2) %in% c(B1,B2,B3)))]
這會產生:
A1 A2 B1 B2 B3 BOTH_PRESENT
1: 1 2 1 3 2 TRUE
2: 2 3 2 4 5 TRUE
雖然我希望第一行為True而第二行為False。
# Row 1
!(F %in% (c(1,2) %in% c(1,3,2)))
# Row 2
!(F %in% (c(2,3) %in% c(2,4,5)))
我該如何更改代碼?
由於我的真實數據集在制作像(A1 == B1 | A1 == B2 | A1 == B3) & (A2 == B1 | A2 == B2 | A2 == B3)
等表達式的列方面要大得多是個很好的解決方案。
我們可以按data.table的行序列進行分組, unlist
'A'列,檢查all
這些元素是否為%in%
unlist
'列。
DT[, BOTH_PRESENT := all(unlist(.SD[, 1:2, with = FALSE]) %in%
unlist(.SD[, 3:5, with = FALSE])), by = 1:nrow(DT)]
或者@Roland提到的,
DT[,BOTH_PRESENT:= all(c(A1, A2) %in% c(B1,B2,B3)), by = seq_len(nrow(DT))]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.