R 通过一行中的字数对字符串向量进行子集设置

R 通过一行中的字数对字符串向量进行子集设置,r,string,subset,stringr,sapply,R,String,Subset,Stringr,Sapply,我有一个字符串向量 rownames [1] "multifarmacias descuento" "multifarmacias" "multifarmacias" 我的目标是用只包含一个单词的字符串在一行中对行名进行子集-输出将是 [1] "multifarmacias" "multifarmacias" 我尝试了以下操作,但它抛出了一个错误: ro

我有一个字符串向量

rownames
[1] "multifarmacias descuento" "multifarmacias"           "multifarmacias"
我的目标是用只包含一个单词的字符串在一行中对
行名
进行子集-输出将是

[1] "multifarmacias"           "multifarmacias"
我尝试了以下操作,但它抛出了一个错误:

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

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

是否有一种优雅的解决方案可以根据字符串的字长来划分字符串向量?

使用
stru count

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

如果我们使用
strsplit
length
(从
baser
)将更有效

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

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

 which(c(2, 1, 1))
错误,其中(c(2,1,1)):“which”的参数不符合逻辑

数据
rownamesA
base R
解决方案是:

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

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

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

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

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