【问题标题】:Using R, how to filter a column to keep item contained in another?使用 R,如何过滤一列以将项目包含在另一列中?
【发布时间】:2016-11-26 08:06:14
【问题描述】:

我确实有一个像这样的数据框

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")

我想得到相同的alldatacolumnb 修改为只保留在columnb 中找到tokeep 中的字符串。

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

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

我首先认为我可以使用类似的东西

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

但我无法找到解决方案。

有人可以指导我吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以尝试使用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]"
    

    【讨论】:

    • 很遗憾我现在不能投票。这真是聪明的罗纳克!
    • [^c|e] 表示不是c|e,你绝对不需要|。此外,[^e] 是一个否定的 character 类,它不适用于超过 1 个字符的字符串。
    • 我明白了。谢谢维克托。根据 OP 显示的示例,我假设 columnb 中的值仅为 1 个字符。
    【解决方案2】:

    另一个选项是str_extract

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

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2017-11-13
      • 2015-06-04
      • 2018-02-25
      • 2020-07-19
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多