【问题标题】:Find and return the partial string itself查找并返回部分字符串本身
【发布时间】:2017-12-01 18:39:24
【问题描述】:

我有一个带有字符串的数据框。我想查找是否在每个元素中找到了部分字符串。作为输出,我想要一个数据框(最终相同),其中我对未找到部分字符串的每个元素都有 NA,以及在找到时实际的部分字符串(仅!)。

此外,我有不止一个部分字符串...而且我知道其中 2 个部分字符串永远不会在同一个元素中!

我最接近它的是:

for(i in 1:length(partial_strings)){
  z <- apply(y,2,function(k)str_replace(k,partial_strings[i], partial_strings[i]))
}
z <- ifelse(z %in% partial_strings,z,NA)

但不幸的是,str_replace 不是只返回部分字符串,而是返回原始元素。我可以理解为什么,但是我尝试了其他方法,这些方法只会使输出远离我想要的。

提前致谢

【问题讨论】:

  • 请提供样本数据集。您通常可以使用grepl 命令执行此操作。 unit-case 语句类似于df$column[!grepl('partial string', df$column)] = NA
  • 如果我理解正确,你有一个字符向量,就像:StringVector &lt;- c("Week39","Week40","Wk41","number50","nbr51","Wk44") 假设你想从上述向量中识别的部分字符串或模式是“周”以及“周”; patterns &lt;- c("Week","Wk") grepl(paste(patterns, collapse="|"), StringVector) ;取决于您的部分字符串是什么,您可以像上面那样在 apply 函数中设计 ifelse()。

标签: r string


【解决方案1】:

stringr 包中的str_extract 是要走的路。如果需要,它会使用正则表达式,这对您有多个要提取的部分字符串很有帮助。

为每个部分字符串创建一个字符串,用"|" 分隔,放在括号内。例如,要从名为text 的字符向量中提取"abc""def"

str_extract(text, "(abc|def)")

If 返回一个与text 长度相同的字符串向量,其中包含"abc""def",只要它们匹配。如果一个字符串匹配两个部分字符串,则仅返回第一个字符串(例如,str_extract("abcghdbdef", "(abc|def)") 仅返回"abc"),尽管您在上面建议这不会发生。如果没有部分匹配,则返回 NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多