使用 R,如何过滤一列以保留另一个列中包含的项目?



>我确实有一个这样的数据帧

columna <- c(1,2,3)
columnb <- c("a b e", "c d", "a c d")
columnc <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
alldata <- data.frame(columna,columnb,columnc)
tokeep <- c("c", "e")

我想得到相同的alldata,修改columnb只保留columnbtokeep中找到的字符串。

理想情况下,我希望有alldata$columnb

[ "e", "c", "c" ]

我最初以为我可以使用类似的东西

filter(alldata, alldata$columnb %in% tokeep)
alldata[which(alldata$b %in% tokeep), ]

但我无法找到解决方案。

有人可以指导我吗?

我们可以尝试使用gsub用空字符串替换我们不想要的字符

alldata$columnb<- gsub(paste0("[^",paste0(tokeep,collapse = "|"),"]"),"", alldata$columnb)
alldata
#  columna columnb    columnc
#1       1       e 2010-11-01
#2       2       c 2008-03-25
#3       3       c 2007-03-14

我们正在创建的正则表达式是

paste0("[^",paste0(tokeep, collapse = "|"), "]")
#[1] "[^c|e]"

这意味着除ce之外的任何内容。

编辑

根据Wiktor的评论,我们可能需要正则表达式作为

paste0("[^",paste0(tokeep,collapse = ""),"]")
#[1] "[^ce]"

另一种选择是str_extract

library(stringr)
alldata$columnb <- str_extract(alldata$columnb, paste(tokeep, collapse="|"))
alldata$columnb
[#1] "e" "c" "c"

最新更新