R: How do you apply grep() in lapply()

HNSKD picture HNSKD · Mar 14, 2016 · Viewed 10k times · Source

I would like to apply grep() in R, but I am not really good in lapply(). I understand that lapply is able to take a list, apply function to each members and output a list. For instance, let x be a list consists of 2 members.

> x<-strsplit(docs$Text," ")
> 
> x
[[1]]
 [1] "I"         "lovehttp"  "my"        "mum."      "I"         "love"     
 [7] "my"        "dad."      "I"         "love"      "my"        "brothers."

[[2]]
 [1] "I"         "live"      "in"        "Eastcoast" "now."      "Job.I"    
 [7] "used"      "to"        "live"      "in"        "WestCoast."  

I would like to apply grep() function to remove words consisting of http. So, I would apply:

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE))

But it does not work and it says

Error in grep(pattern = "http", invert = TRUE, value = TRUE) : 
argument "x" is missing, with no default

So, I tried

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE,x))

But it says

Error in match.fun(FUN) : 
'grep(pattern = "http", invert = TRUE, value = TRUE, x)' is not a 
function, character or symbol

A help please, and thanks!

Answer

Tim Biegeleisen picture Tim Biegeleisen · Mar 14, 2016

The following line of code will remove all entries from vectors in your list which contain the substring http:

repx <- function(x) {
    y <- grep("http", x)
    vec <- rep(TRUE, length(x))
    vec[y] <- FALSE
    x <- x[vec]
    return(x)
}

lapply(lst, function(x) { repx(x) })

Data:

x1 <- c("I", "lovehttp", "my", "mum.", "I", "love", "my", "dad.", "I", "love", "my", "brothers.")
x2 <- c("I", "live", "in", "Eastcoast", "now.", "Job.I", "used", "to", "live", "in", "WestCoast.")
lst <- list(x1, x2)