我有一个向量,我只需要第一个单词。这些词有不同的长度。单词由符号(。和_)分隔。如何使用substr()
函数获取仅包含第一个单词的新向量?
我在想这样的事情
x <- c("wooombel.ab","mugran.cd","friendly_ef.ab","hungry_kd.xy")
y <- substr(x,0, ???)
我认为sub
带有一些正则表达式将是最简单的解决方案:
sub(pattern = "[._].*", replacement = "", x = x)
# [1] "wooombel" "mugran" "friendly" "hungry"
尝试:
sapply(strsplit(x,'[._]'), function(x) x[1])
[1] "wooombel" "mugran" "friendly" "hungry"
你也可以使用包stringr
。它有一些非常方便的字符串操作功能。
想到这个问题的是word
。它有一个sep
参数,允许使用正则表达式。
> x <- c("wooombel.ab","mugran.cd","friendly_ef.ab","hungry_kd.xy")
> library(stringr)
> word(x, sep = "[._]")
# [1] "wooombel" "mugran" "friendly" "hungry"
另一个允许你继续使用substr
的选项是str_locate
。因此,如果我们只从结果中减去1,我们就可以获得所需的第一个单词。
> substr(x, 1, str_locate(x, "[._]")-1)
# [1] "wooombel" "mugran" "friendly" "hungry"
使用stringi
的提取方法:
library(stringi)
stri_extract_first_regex(x, "[a-z]+(?=[._])")
## [1] "wooombel" "mugran" "friendly" "hungry"
虽然"[^a-z]+(?=[._])"
可能更明确。
[^a-z]+ any character except: 'a' to 'z' (1 or
more times)
(?= look ahead to see if there is:
[._] any character of: '.', '_'
) end of look-ahead