【发布时间】:2014-06-18 06:19:56
【问题描述】:
我对 R 很陌生,我在网上找不到一个简单的例子来说明如何从向量(数组?)的每个元素中删除最后 n 个字符
我来自 Java 背景,所以我想做的是遍历 a$data 的每个元素并从每个元素中删除最后 3 个字符。
你会怎么做?
【问题讨论】:
我对 R 很陌生,我在网上找不到一个简单的例子来说明如何从向量(数组?)的每个元素中删除最后 n 个字符
我来自 Java 背景,所以我想做的是遍历 a$data 的每个元素并从每个元素中删除最后 3 个字符。
你会怎么做?
【问题讨论】:
这是我会做的一个例子。我希望它是您正在寻找的。p>
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
【讨论】:
-3 更改为-0 才能获得预期的效果!我有很多日期数据,例如:"2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST" - 是的,两个时区在一起,并且 as.Date 函数返回意外结果(BST 日期提前一天) - 因此我想删除时区戳,结果我必须做-0 它消失了,还有几个小时
strptime)。
这是gsub的一种方式:
cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap" "b"
【讨论】:
gsub('.{5}$', '', 'abcd')。
虽然这与@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 个字符。
【讨论】:
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"
【讨论】:
类似于@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
【讨论】:
sub()代替gsub()。
使用字符串的 n 个字符进行截断/替换时的友好提示:
-->注意字符串中的空格!
使用base::gsub(' ', '', x, fixed = TRUE) 去除字符串中不需要的空格。我花了很多时间来找出为什么上面提供的出色解决方案对我不起作用。认为它可能对其他人也有用;)
【讨论】: