2016-09-06 14 views
0

Ich habe eine Spalte in meinem Datenrahmen, die ich in mehrere Spalten mit dem Trennzeichen "_" teilen muss. Ich muss jedoch nur die letzten zwei Spalten aus der Ausgabe (die immer die Daten enthalten, die ich brauche) in jeder Zeile beibehalten. In vielen Datensätzen ist die Anzahl der Trennzeichen unterschiedlich, was zu einer anderen Anzahl von Spalten führt, wenn sie geteilt werden. Wie bekomme ich nur die letzten zwei Spalten jeder Beobachtung? Die folgenden sind Beispiele für einige der AufzeichnungenAufteilen unregelmäßiger Spalten in 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 

Ich versuche, eine Ausgabe so etwas wie zu bekommen:

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

Meine Lösung hat einige Probleme, dh es gibt zwei Reihen mit 57k Spalten und ihre etwas langsam, jemand eine bessere Lösung als:

> 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 

Antwort

4

Es ist möglich, dies zu erreichen durch einen regulären Ausdruck:

012.351.
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

Tolle Idee regex, Art und Weise einfacher! Definitiv gearbeitet – sc73

1

Wir könnten auch dies mit 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 
Verwandte Themen