编辑:更新以解决意见:
下也非常快(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