【问题标题】:Subsetting string vector by word count in one line在一行中按字数对字符串向量进行子集
【发布时间】:2020-12-07 02:05:00
【问题描述】:

我有一个字符串向量

rownames
[1] "multifarmacias descuento" "multifarmacias"           "multifarmacias"

我的目标是在一行中将rownames 子集化为仅包含一个单词的字符串 - 输出将是

[1] "multifarmacias"           "multifarmacias"

我尝试了以下方法,但它会引发错误:

rownames[which(sapply(strsplit(rownames, " "),length)) == 1]

Error in which(sapply(strsplit(rownames, " "), length)) : 
  argument to 'which' is not logical

是否有一个优雅的解决方案可以通过字符串的单词长度对字符串向量进行子集?

【问题讨论】:

    标签: r string subset stringr sapply


    【解决方案1】:

    str_count 会更容易

    library(stringr)
    rownames[str_count(rownames, "\\w+") == 1]
    #[1] "multifarmacias" "multifarmacias"
    

    如果我们使用strsplitlengths(来自base R)会更有效

    rownames[lengths(strsplit(rownames, "\\s+")) == 1]
    #[1] "multifarmacias" "multifarmacias"
    

    OP 帖子中的错误是基于) 的错误放置,它应该在==1 之后,因为which 直接应用于长度向量,即

     which(c(2, 1, 1))
    

    error in which(c(2, 1, 1)) : 'which' 的参数不合逻辑

    数据

    rownames <- c("multifarmacias descuento", "multifarmacias", "multifarmacias")
    

    【讨论】:

      【解决方案2】:

      base R 的解决方案是:

      #Data
      x <- c("multifarmacias descuento", "multifarmacias", "multifarmacias")
      
      #Code
      x[which(lapply(strsplit(x,split = ' '),length)==1)]
      

      输出:

      [1] "multifarmacias" "multifarmacias"
      

      【讨论】:

        【解决方案3】:

        这是另一个使用 grep 的基本 R 选项

        grep("\\s",rownames,invert = TRUE,value = TRUE)
        

        给了

        > grep("\\s",rownames,invert = TRUE,value = TRUE)
        [1] "multifarmacias" "multifarmacias"
        

        【讨论】:

          猜你喜欢
          • 2016-12-01
          • 1970-01-01
          • 2021-03-15
          • 1970-01-01
          • 1970-01-01
          • 2021-02-04
          • 1970-01-01
          • 2012-10-14
          • 2020-12-28
          相关资源
          最近更新 更多