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


106

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

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

你会怎么做?

Answers:


115

这是我会做的一个例子。我希望这就是您要寻找的。

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)

现在应包含:

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

有趣地,我不得不改变-3,以-0获得预期的效果!我有很多带有日期的数据,例如:"2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"-是的,两个时区在一起,并且as.Date函数返回意外结果(BST日期的前一天)-因此,我想删除时区标记,事实证明我必须会-0消失,再加上几个小时
LucasSeveryn 2014年

还要考虑strptime函数,不过我之前没有使用过时区。我认为它可能会认识到。假定“%Z”识别时区。我还删除了sapply函数。我忘了R喜欢向量化它的功能。
nfmcclure

@LucasSeveryn如果您想将字符时间表示形式转换为考虑了时区的日期,请对其进行编辑。可能会有更好的答案,这些答案将使您直接获得所需的结果(例如strptime)。
蓝色魔导师

84

这是一种方法gsub

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

4
(+1)正则表达式的忠实拥护者。它几乎可以用于所有事物。
Rich Scriven

8
注意:如果原始字符串的长度大于要剪切的字符数,则返回原始字符串。考虑一下gsub('.{5}$', '', 'abcd')
Tomas Greif

32

尽管这与@nfmcclure的答案基本相同,但我更喜欢使用stringrpackage,因为它提供了一组函数,这些函数的名称比基R中的名称最一致和更具描述性(实际上,我一直在搜索“如何获取R”中的字符,因为我忘记了名称nchar())。

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

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


22
使用该stringr软件包,有一个甚至更简单的解决方案: str_sub(iris$Species, end=-4)
jan-glx

14

使用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" 

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将返回未经修改的原始字符串。

注意,NB的使用{,3}等效于{0,3},我只是更喜欢后者。

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


您可以使用sub()代替gsub()
sindri_baldur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.