如何在R中的向量上使用sub?

时间:2017-07-19 19:43:06

标签: r

考虑这个R代码和输出:

> the_string <- "a, b, c"
> the_vec <- strsplit(the_string, ",")
> str(the_vec)
List of 1
 $ : chr [1:3] "a" " b" " c"
> str(sub("^ +", "", the_vec))
 chr "c(\"a\", \" b\", \" c\")"

看起来sub返回单个字符数组而不是字符数组的向量。我希望:

chr [1:3] "a" "b" "c"

我如何得到它?

编辑:the_string将来自用户,所以我想容忍可变数量的空格,零到多。

编辑:令牌中间可能有空格应该保留。因此,"a, b c,d"应该会产生c('a', 'b c', 'd')

3 个答案:

答案 0 :(得分:3)

the_string <- "a, b, c"
the_vec <- unlist(strsplit(the_string, ", "))

如果你在逗号之后添加空格并取消整个事物,你就得到了矢量。

<强>更新

如果字符串在字符之间有不同的空格,我会删除所有多余的空格,然后运行与上面相同的空格。我选择了5但也许你的字符串有更多。另外,我添加了第二步,以分割字符之间没有逗号的字符。

a <- "a, b,  c,   d,    e, f    g, h,i"
a <- gsub("( {2,5})", " ",a)
a <- unlist(strsplit(a, ", |,"))
unlist(strsplit(a, " "))


[1] "a" "b" "c" "d" "e" "f" "g" "h" "i"

答案 1 :(得分:1)

strsplit创建一个列表,其中每个元素都是原始向量中每个项目的拆分向量,例如:

strsplit( c("a, b, c", "d, e"), ",")
[[1]]
[1] "a"  " b" " c"

[[2]]
[1] "d"  " e"

这里输入向量中只有一个项目,因此结果全部出现在列表的第一项中:

the_string <- "a, b, c"
the_list <- strsplit(the_string, ",")
sub("^ +", "", the_list[[1]])
[1] "a" "b" "c" 

如果您不使用[[1]]unlistthe_list会使用as.character强制转换为字符向量:

as.character(the_list)
[1] "c(\"a\", \" b\", \" c\")"

答案 2 :(得分:0)

一个基础-R解决方案

lapply(the_vec, function(x) sub("^ +", "", x))[[1]]
[1] "a" "b" "c"