簡體   English   中英

基於 R 中的兩個 grep() 命令尋址 data.table 列

[英]Adressing data.table columns based on two grep() commands in R

我試圖根據 data.table 中的兩個條件查找行。 這兩個條件是長字符串中存在某些單詞。 一個最小的示例如下所示:

library("data.table")
dt <- data.table(var1 = c("abc","adb","acf"))

現在我嘗試通過在var1的同一條目中查找同時出現的"a""b"來找到元素 1 和 2。 實際上,數據表有幾十萬個條目,字符串是長公式,我在其中查找多字符單詞。 這是我的嘗試:

dt[grep("a", var1) & grep("b", var1)]

引發警告:

In grep("a", var1) & grep("b", var1) :
longer object length is not a multiple of shorter object length

看起來data.table正在按順序做某事? 在我看來,這應該與dt[var1 == X & var2 == Y]相同,這將起作用......感謝任何幫助!

ps:為了完整起見,這里是對我希望具有相同來源的實際數據的警告(否則我的示例是垃圾):

Error in `[.data.table`(collected, grep(pairs[i, 1], model_formula) &  : 
i evaluates to a logical vector length 423098 but there are 3980284 rows. 
Recycling of logical i is no longer allowed as it hides more bugs than is 
worth the rare convenience. Explicitly use rep(...,length=.N) if you 
really need to recycle.
In addition: Warning message:
In grep(pairs[i, 1], model_formula) & grep(pairs[i, 2], model_formula) :
longer object length is not a multiple of shorter object length

grep grepl它應該可以正常工作..或按照評論中的說明調整您的正則表達式。

dt[grepl("a", var1) & grepl("b", var1)]

#    var1
# 1:  abc
# 2:  adb

基於intersect()的第三個選項:

dt[intersect(grep("a", var1), grep("b", var1))]

暫無
暫無

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

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