2016-03-19 46 views
0

我有以下矢量:拆分或替代字符串与通配符中的R

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

我基本上要分成两个载体: ("abc", "def")("lvl1", "lvl2)。我知道如何用子替换:

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

我认为这可以翻译为“搜索任何数量的任何字符之前”_“并且不进行任何替换。因此 - 我想 - 这应该给我的其他所需的载体:

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

[1] "bc_lvl1" "ef_lvl2" 

在哪里搞错了吗? 这实质上是excel中“text-to-columns”函数的等价物。

+1

只需使用'strsplit'? – A5C1D2H2I1M1N2O1R2T1

+0

似乎是合法的,但它创建了一个向量列表,我需要再次分割:strsplit(a,“_”) [[1]] [1]“abc”“lvl1” [[2 ]] [1]“def”“lvl2” – nouse

+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 = "(.*)_(.*)") 
3

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

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

我对excel评论非常抱歉。这只是“自由联想”。这些向量与excel文件无关。对不起。 – nouse

+0

@nouse我没有真正阅读你的excel文件评论。这是一种分解成列 – akrun

+0

这是我误解了。有用! :> – nouse

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"