在R中使用通配符拆分或替换字符串

时间:2016-03-19 16:59:43

标签: regex r

我有以下矢量:

a <- c("abc_lvl1", "def_lvl2")

我基本上想分成两个向量: ("abc", "def")("lvl1", "lvl2)。我知道如何用sub替换:

sub(".*_", "", a)
[1] "lvl1" "lvl2"

我认为这可以转化为“在”_“之前搜索任意数量的任何字符,并替换为空。”因此 - 我想 - 这应该给我另一个所需的矢量:

sub("_*.", "", a),但它只删除了主角:

[1] "bc_lvl1" "ef_lvl2"

我在哪里陷入困境? 这基本上等同于excel中的“text-to-columns”功能。

3 个答案:

答案 0 :(得分:5)

有几种方法可以做到这一点。以下是一些,一些使用包,另一些使用基础R。

假设:

a <- c("abc_lvl1", "def_lvl2")

以下是一些选项:

do.call(rbind, strsplit(a, "_", TRUE))

matrix(scan(what = "", text = a, sep = "_"), ncol = 2, byrow = TRUE)

scan(text = a, sep = "_", what = list("", "")) ## a list

library(splitstackshape)
cSplit(data.table(a), "a", "_")

library(data.table)
setDT(tstrsplit(a, "_"))[]

library(dplyr)
library(tidyr)
data_frame(a) %>%
  separate(a, into = c("this", "that"))

library(reshape2)
colsplit(a, "_", c("this", "that"))

library(stringi)
t(stri_split_fixed(a, "_", simplify = TRUE))

library(iotools)
mstrsplit(a, "_")  # Matrix
dstrsplit(a, col_types = c("character", "character"), "_") # data.frame

library(gsubfn)
read.pattern(text = a, pattern = "(.*)_(.*)")

答案 1 :(得分:3)

我们可以使用read.csv/read.table并指定sep="_"。它会将字符串分成两列。

read.csv(text=a, sep="_", header=FALSE)

答案 2 :(得分:2)

仅以最初的评论为基础

a <- c("abc_lvl1", "def_lvl2")

a1 <- do.call(c, lapply(a, function(x){strsplit(x, "_")[[1]][1]}))
a2 <- do.call(c, lapply(a, function(x){strsplit(x, "_")[[1]][2]}))

a1
[1] "abc" "def"
a2
[1] "lvl1" "lvl2"