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

Luc*_*ryn 90 string r

我是R的新手,我在网上找不到一个简单的例子,说明如何从向量的每个元素中删除最后n个字符(数组?)

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

你会怎么做?

nfm*_*ure 104

这是我要做的一个例子.我希望这就是你要找的东西.

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)
Run Code Online (Sandbox Code Playgroud)

a现在应该包含:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4
Run Code Online (Sandbox Code Playgroud)


Mat*_*rde 76

这是一种方式gsub:

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

  • 注意:如果原始字符串比要剪切的字符数更长,则返回原始字符串.考虑`gsub('.{5} $','','abcd')`. (8认同)
  • (+1)正则表达的忠实粉丝.它几乎可用于任何事物. (3认同)

Bla*_*ard 22

尽管这与@nfmcclure的答案大致相同,但我更喜欢使用stringr包,因为它提供了一组函数,这些函数的名称与基本R中的名称最一致和描述性(实际上我总是谷歌"如何获取数量R中的字符"因为我记不起名字了" nchar().

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`stringr`包有一个更简单的解决方案:`str_sub(iris $ Species,end = -4)` (12认同)

gag*_*ews 13

使用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 but 4th char
## [1] "foo_" "bar_" "ap"   "b" 
Run Code Online (Sandbox Code Playgroud)


kra*_*ads 5

类似于 @Matthew_Plourde 使用gsub

但是,如果原始字符串短于要剪切的字符数,则使用将修剪到零个字符的模式,即返回“” :

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

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

NB 使用{,3}相当于{0,3},我只是更喜欢后者。

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