2016-03-19 100 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"