我有一个像这样的矩阵(每一行都是一个字符串):
m <- matrix(c("Agarista revoluta (Spreng.) Hook. f. ex Nied.",
"Amaioua intermedia Mart.",
"Baccharis reticularia DC."),, 1)
我想在第二个空格后删除文本并返回:
Agarista revoluta
Amaioua intermedia
Baccharis reticularia
我尝试了gsub
的一些组合,但我没有成功。
任何人都可以帮我吗?
答案 0 :(得分:6)
您可以使用
x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.", "Baccharis reticularia DC.")
sub("^(\\S*\\s+\\S+).*", "\\1", x)
## => [1] "Agarista revoluta" "Amaioua intermedia" "Baccharis reticularia"
模式详情:
^
- 字符串开头(\\S*\\s+\\S+)
- 第1组捕获0 +非空白字符,然后是1 +空格,然后是1 +非空格.*
- 任意0个字符,尽可能多(直到字符串结尾)。请注意,如果您的字符串可能有前导空格,并且您不想计算该空格,则应使用
sub("^\\s*(\\S+\\s+\\S+).*", "\\1", x)
答案 1 :(得分:3)
另一种可能的正则表达式可能是,
sub('^(\\w+\\s+\\w+).*', '\\1', x)
#[1] "Agarista revoluta" "Amaioua intermedia" "Baccharis reticularia"
或者,stringr
包对这些类型的操作有一些很好的功能。例如,
library(stringr)
word(x, 1, 2)
#[1] "Agarista revoluta" "Amaioua intermedia" "Baccharis reticularia"
答案 2 :(得分:2)
这不使用正则表达式或包:
with(read.table(text = m, fill = TRUE), trimws(paste(V1, V2)))
,并提供:
[1] "Agarista revoluta" "Amaioua intermedia" "Baccharis reticularia"
如果每个输入至少有两个单词,那么您可以省略trimws
。
答案 3 :(得分:1)
将字符串拆分为“”然后将前两个文本分开并将它们粘贴在一起
x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.",
"Baccharis reticularia DC.")
sapply(x, function(y) paste(unlist(strsplit(y, " "))[1:2], collapse = " "))