編輯:更新以解決意見:
下也非常快(0.31秒,比以前更快):
rows <- which(
rowSums(
`dim<-`(grepl("U", as.matrix(df), fixed=TRUE), dim(df))
) > 0
)
,併產生相同的結果,以前的答案。使用fixed=FALSE
大約加倍的時間,但你的例子並不需要這樣做。
我們在這裏所做的是通過將grepl
一個矩陣,雖然作弊真的,我們關心的是轉df
成向量(其中一個矩陣)和as.matrix
是更快的方法可以做到這一個東西。然後我們可以運行一個grepl
命令。最後,我們使用dim<-
將grepl
向量結果轉換回矩陣,並使用rowSums
來檢查哪些行匹配。
這裏有原因,這是不是您的版本快得多:
- 我們稱之爲
grepl
一次,而不是一萬次你因爲函數apply
申請得到的每一行調用一次與apply
做; grepl
是向量化的,這意味着您想要最小化您多次調用它並利用矢量化。
- 我們用
rowSums
而不是apply
執行行匹配計數; rowSums
是apply(x, 1, sum)
的更快版本(請參閱?rowSums
的文檔)。
以前的答案:
這裏是0.35秒運行一次一個相對簡單的解決方案在我的系統爲1MM行乘4列的數據幀:
rows <- which(rowSums(as.matrix(df) == "U") > 0)
爲了確認
df[head(rows), ]
產生(每行都有一個U) :
a b c d
5 F B D U
8 R S U F
15 U L R P
20 U E E O
21 Y U D I
32 P F U H
並且數據:
set.seed(1)
df <- as.data.frame(
`names<-`(
replicate(4, sample(LETTERS, 1e6, rep=T), simplify=F),
letters[1:4]
)
)
我編輯了示例data.frame來顯示目標是識別data.frame中與查詢匹配的元素,但可能不是嚴格相等(「==」)。這就是爲什麼我在第一個例子中使用grep的原因。對困惑感到抱歉。 – jul635 2014-09-04 14:44:29