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

时间:2014-05-01 17:45:33

标签: r string

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

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

你会怎么做?

5 个答案:

答案 0 :(得分:85)

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

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

答案 1 :(得分:69)

这是gsub的一种方式:

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

答案 2 :(得分:20)

尽管这与@nfmcclure的答案大致相同,但我更喜欢使用stringr包,因为它提供了一组函数,其名称与基本R中的名称最一致和描述性(事实上我总是谷歌对于&#34;如何获取R&#34; 中的字符数,因为我无法记住名称nchar())。

library(stringr)
str_sub(iris$Species, 1, str_length(iris$Species)-3)

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

答案 3 :(得分: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" 

答案 4 :(得分:2)

类似于gsub的@Matthew_Plourde

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

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