如何去除 R 向量中每个元素的最后 n 个字符

我对 R 非常陌生,我找不到一个简单的例子在线如何删除最后 n 个字符从一个向量的每个元素(数组?)

我来自 Java 背景,所以我想做的是迭代 a$data的每个元素,并删除每个元素的最后3个字符。

你会怎么做?

236143 次浏览

这里有一个例子,我会怎么做。我希望这是你正在寻找的。

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

A 现应包括:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

Stringi一揽子计划也可以实现同样的目标:

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4))  # from the first to the (last-4)-th character
## [1] "foo_" "bar_" "ap"   "b"

下面是 gsub的一个方法:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

尽管这和@nfmcclure 的答案大致相同,但我更喜欢使用 stringr包,因为它提供了一组函数,这些函数的名称比以 R 为基数的函数名称更加一致和具有描述性(事实上,我总是在谷歌上搜索 “如何得到 R 中的字符数”,因为我记不住 nchar()的名称)。

library(stringr)
str_sub(iris$Species, end=-4)
#or
str_sub(iris$Species, 1, str_length(iris$Species)-3)

这将从 Species列的每个值中删除最后3个字符。

类似于@Matthew _ Plourde 使用 gsub

然而,使用一种模式,将裁剪到零个字符,即返回“”,如果原始字符串是 更短比字符数量削减:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

区别在于,{0,3}量词表示0到3个匹配,而 {3}需要正好3个匹配,否则找不到匹配,在这种情况下,gsub返回原始的、未修改的字符串。

使用 {,3}的注释将等同于 {0,3},我只是更喜欢后一种注释。

有关正则表达式量词的更多信息,请参见: Https://www.regular-expressions.info/refrepeat.html

当使用字符串的 n 个字符来截断/替换时,友好的提示:

注意字符串中的空格!

使用 base::gsub(' ', '', x, fixed = TRUE)去除字符串中不需要的空格。我花了相当多的时间来找出为什么上面提供的伟大的解决方案不适合我。认为这对其他人也有用;)