2012-01-25 18 views
3

一個簡單的「有更好的方法」的問題。我想找到,如果在data.frame任何單元格中包含的子字符串我在尋找:grep在data.frame中的任何單元格

d=data.frame(V1=c("xxx","yyy","zzz"), V2=c(NA,"ewruinwe",NA)) 
grepl("ruin",d[2,2]) #TRUE 
grepl("ruin",d) #FALSE FALSE 
any(grepl("ruin",as.character(as.matrix(d)))) #TRUE 

最後一行我想要做什麼,但它看起來這麼難看,我想知道如果我我錯過了一些簡單的事情。

背景:dt=readHTMLTable(url)(XML包)中的元素之一。我正在執行d [2,2]方法,檢查錯誤消息,並且剛發現網站有時會向HTML表格添加另一行,將我正在尋找的錯誤消息推送到另一個單元格。

更新:所以,似乎這兩個選擇(感謝mathematical.coffee和羅馬Luštrik)是:

any(grepl("ruin",as.matrix(d))) 
any(apply(d, 2, function(x) grepl("ruin", x))) 
+2

對於什麼是值得的,你不必做'as.matrix'之後的'as.character',因爲R已經這樣做了。即'any(grepl('ruin',as.matrix(d),ignore.case = T))'。我認爲它就像你會得到的一樣光滑。你可以使用'apply'和朋友,但看起來更糟:'any(apply(d,1,function(x)grepl(「ruin」,x,ignore.case = T))' –

回答

7

這個怎麼樣?

d=data.frame(V1=c("xxx","yyy","zzz"), V2=c(NA,"ewruinwe",NA)) 
apply(d, c(1,2), function(x) grepl("ruin", x)) 
     V1 V2 
[1,] FALSE FALSE 
[2,] FALSE TRUE 
[3,] FALSE FALSE 

正如在評論「2」中指出的那樣與「c(1,2)」一樣。然後給出一個單一的布爾值:

any(apply(d, 2, function(x) grepl("ruin", x))) 
[1] TRUE 
+2

apply(d,2 ,函數(x)grepl('ruin',x))也起作用。 – Justin

相關問題