在一行中按字数对字符串向量进行子集化

Subsetting string vector by word count in one line

我有一个字符串向量

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

是否有一个优雅的解决方案来根据字符串的单词长度对字符串向量进行子集化?

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 post 中的错误是基于 ) 的错误放置,它应该在 ==1 之后,因为 which 直接应用于矢量长度即

 which(c(2, 1, 1))

Error in which(c(2, 1, 1)) : argument to 'which' is not logical

数据

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

一个base R解决方案是:

#Data
x <- c("multifarmacias descuento", "multifarmacias", "multifarmacias")

#Code
x[which(lapply(strsplit(x,split = ' '),length)==1)]

输出:

[1] "multifarmacias" "multifarmacias"

这是另一个使用 grep

的基本 R 选项
grep("\s",rownames,invert = TRUE,value = TRUE)

这给出了

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