【问题标题】:R strsplit with multiple unordered split arguments?R strsplit 与多个无序拆分参数?
【发布时间】:2012-05-31 02:38:46
【问题描述】:

给定一个字符串

test_1<-"abc def,ghi klm"
test_2<-"abc, def ghi klm"

我想获得

"abc"
"def"
"ghi"

但是,使用strsplit,必须知道字符串中拆分值的顺序,因为strsplit使用第一个值进行第一次拆分,第二个进行第二次...然后循环使用。

但这不是:

strsplit(test_1, c(",", " "))
strsplit(test_2, c(" ", ","))

strsplit(test_2, split=c("[:punct:]","[:space:]"))[[1]]

我希望在单个步骤中找到任何拆分值的地方拆分字符串。

【问题讨论】:

  • 其实strsplit(test_1, c(" ", ",")) 对我不起作用。它返回:"abc def" "ghi klm"
  • 你是对的。我删除了它。如果你有一个,我仍然想添加一个使用多个拆分值的工作示例。

标签: r split


【解决方案1】:

实际上strsplit 也使用 grep 模式。 (逗号是正则表达式元字符,而空格不是;因此需要在模式参数中对逗号进行双重转义。因此,使用"\\s" 更多的是为了提高可读性而不是必要的):

> strsplit(test_1, "\\, |\\,| ")  # three possibilities OR'ed
[[1]]
[1] "abc" "def" "ghi" "klm"

> strsplit(test_2, "\\, |\\,| ")
[[1]]
[1] "abc" "def" "ghi" "klm"

如果不同时使用 \\,\\, (请注意 SO 未显示的额外空间),您将获得一些字符 (0) 值。如果我写的话可能会更清楚:

> strsplit(test_2, "\\,\\s|\\,|\\s")
[[1]]
[1] "abc" "def" "ghi" "klm"

@Fojtasek 非常正确:使用字符类通常会简化任务,因为它会创建一个隐含的逻辑 OR:

> strsplit(test_2, "[, ]+")
[[1]]
[1] "abc" "def" "ghi" "klm"

> strsplit(test_1, "[, ]+")
[[1]]
[1] "abc" "def" "ghi" "klm"

【讨论】:

  • strsplit(test_2, "[, ]+") 怎么样
  • strsplit(test_2, "[[:punct:][:space:]]+") 获取 OP 的更新请求。
【解决方案2】:
 test_1<-"abc def,ghi klm"
 test_2<-"abc, def ghi klm"
 key_words <- c("abc","def","ghi")
 matches <- str_c(key_words, collapse ="|")
 str_extract_all(test_1, matches)
 str_extract_all(test_2, matches)

【讨论】:

    【解决方案3】:

    如果你不喜欢正则表达式,可以多次调用strsplit()

    strsplits <- function(x, splits, ...)
    {
        for (split in splits)
        {
            x <- unlist(strsplit(x, split, ...))
        }
        return(x[!x == ""]) # Remove empty values
    }
    
    strsplits(test_1, c(" ", ","))
    # "abc" "def" "ghi" "klm"
    strsplits(test_2, c(" ", ","))
    # "abc" "def" "ghi" "klm"
    

    更新添加的示例

    strsplits(test_1, c("[[:punct:]]","[[:space:]]"))
    # "abc" "def" "ghi" "klm"
    strsplits(test_2, c("[[:punct:]]","[[:space:]]"))
    # "abc" "def" "ghi" "klm"
    

    但是如果你要使用正则表达式,你还不如使用@DWin 的方法:

    strsplit(test_1, "[[:punct:][:space:]]+")[[1]]
    # "abc" "def" "ghi" "klm"
    strsplit(test_2, "[[:punct:][:space:]]+")[[1]]
    # "abc" "def" "ghi" "klm"
    

    【讨论】:

      【解决方案4】:

      你可以选择strsplit(test_1, "\\W")

      【讨论】:

      • 你可以使用 strsplit(test_1, "\\W+")。
      猜你喜欢
      • 2022-06-15
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多