2016-09-06 84 views
0

我在我的數據框中有一列需要使用分隔符「_」分割成多個列。但是,我需要僅保留每行中輸出的最後兩列(它將始終包含我需要的數據)。在許多記錄中,分隔符的數量不同,因此分割時導致不同數量的列。我怎樣才能得到每個觀察的最後兩列。的一些記錄分割r中的不規則列

unique(data$tagid.1) 
[1] tag id         00000_0_0900_226000013189     
[3] 00000_0_0986_114100005288     00000_0_0900_226000132078     
[5] 00000_0_09LA_00000_0_0900_226000   00000_0_0900_226000131998     
[7] 0000_2004000000000847      00000_0_0900_22600001\a\0048\022LI  
[9] 00000_0_0900_226000013189I    00000_0_0986_114100006473 

我試圖得到一個輸出類似下面是一些例子:

tagid$C1   tagid$C2 
0986    114100005288  
0900    226000013189 
0900    226000 
etc....   etc.... 

我的解決方案存在一些問題,即它輸出具有57K列兩行的那種緩慢的,任何人都有一個更好的解決方案比:

> data.tag <- as.data.frame(data$tagid.1) 
> tag1 <- cSplit(data.tag,"data$tagid.1",sep="_") 
> 
> head(tag1) 
    data$tagid.1_1 data$tagid.1_2 data$tagid.1_3 data$tagid.1_4 data$tagid.1_5   data$tagid.1_6 data$tagid.1_7 
1:   tag id    NA    NA    NA    NA     NA    NA 
2:   00000    0   0900 226000013189    NA    NA    NA 
3:   00000    0   0900 226000013189    NA    NA    NA 
4:   00000    0   0900 226000013189    NA    NA    NA 
5:   00000    0   0900 226000013189    NA    NA    NA 
6:   00000    0   0900 226000013189    NA    NA    NA 
> 
> lastValue <- function(x) tail(x[!is.na(x)], 2) 
> tag2 <- as.data.frame(apply(tag1, 1, lastValue)) 
> dim(tag2) 
[1]  2 56997 

回答

4

有可能通過使用正則表達式來實現這一目標:

pat <- "^.*_(.*)_(.*)$" 
data.tag <- data.frame(tagid.1 = c("tag id", 
         "00000_0_0900_226000013189", 
         "00000_0_0986_114100005288", 
         "00000_0_0900_226000132078", 
          "00000_0_0900_22600001\a\0048\022LI")) 
data.frame(C1 = sub(pat, "\\1", data.tag[,1]), 
      C2 = sub(pat, "\\2", data.tag[,1])) 


     C1     C2 
1 tag id    tag id 
2 0900   226000013189 
3 0986   114100005288 
4 0900   226000132078 
5 0900 22600001\a\0048\022LI 
+0

好主意!絕對有效 – sc73

1

我們也可以做到這一點與使用正則表達式,比較容易的方式strsplit

setNames(do.call(rbind.data.frame, lapply(strsplit(as.character(data.tag[,1]), "_"), 
      function(x) if(length(x)==1) rep(x, 2) else tail(x,2))), paste0("C", 1:2)) 
#  C1     C2 
#1 tag id    tag id 
#2 0900   226000013189 
#3 0986   114100005288 
#4 0900   226000132078 
#5 0900 22600001\a\0048\022LI