我有以下矢量:
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”功能。
答案 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"