【问题标题】:Partial string exact matching部分字符串精确匹配
【发布时间】:2016-10-13 04:53:32
【问题描述】:

我进行了很多搜索,但找不到解决方案...我认为对你们中的许多人来说这很容易...但对我来说不是。

 df <- data.frame(site = c("11", " 4 , 111", "3,1 ", "4,11111 "))
> df
      site
1       11
2  4 , 111
3     3,1 
4 4,11111

我有一列,其中多个站点代码可能用逗号分隔(不是可能出现的随机空格)。我正在尝试查找与感兴趣的字符串站点编号匹配的行。

搜索站点为 11 或 3 'c(1,3)' 匹配的行的结果应返回:

[1] 1 0 1 0

我似乎无法解决这个问题......我想答案将包括

temp <- strsplit(df$site, ",")

,但我似乎无法理解如何在该步骤之后在列表上应用函数...我会做一个

grepl(c("^11$", "^3$"), temp)

但这不起作用。

【问题讨论】:

  • 1 和 0 代表什么?它们只是“是”和“否”还是应该给出每个字符串中的匹配数?
  • 有点悠闲的版本:library(tidyverse) ; df %&gt;% group_by(row = row_number()) %&gt;% separate_rows(site, sep = ',', convert = TRUE) %&gt;% summarise(result = as.integer(any(site == 11 | site == 3)))

标签: r data-manipulation grepl


【解决方案1】:

由于您正在寻找完全匹配而不是模式匹配,您可以试试这个:

df <- data.frame(site = c("11", " 4 , 111", "3,1 ", "4,11111 "), stringsAsFactors = FALSE)
as.integer(unlist(lapply(strsplit(df$site, split=","), function(x) any(x == 3 | x == 11))))

[1] 1 0 1 0

【讨论】:

  • 你也可以做一些代码压缩sapply(strsplit(df$site, split=","), function(x) any(x %in% c(3,11)))
  • 这些编辑使它完全工作: sapply(strsplit(as.character(df$site), split=","), function(x) any(as.numeric(x) %in% c(11,1)))。非常感谢!
【解决方案2】:

您可以尝试使用 sapply

as.integer(sapply(df$site,function(x)grepl("^11|^3",x)))

[1] 1 0 1 0

【讨论】:

  • 搜索 '1' 只得到 1 0 0 0,这是不正确的。
【解决方案3】:

我们可以做一个grep

+(grepl("\\b(3|11)\\b", df$site))
#[1] 1 0 1 0

【讨论】:

    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2023-03-24
    • 2016-05-27
    • 2021-02-06
    相关资源
    最近更新 更多