2017-06-01 4 views
2

extrahiert werden kann Ich habe eine Datentabelle in R mit Textspalten von Doppelpunkt getrennten Daten. Ich möchte eine Matrix/Datentabelle der Ergebnisse zurückgeben, wo einer der begrenzten Werte für jede Zelle zurückgegeben wird.Wie effizient abgegrenzte Zeichenfolgen aus einer Datentabelle in R

Der unten eingefügte Code zeigt das Problem und ist eine funktionierende Lösung. Meine tatsächliche Datentabelle ist jedoch groß (einige tausend Zeilen und Spalten), und die eingefügte Methode dauert in der Größenordnung von ein oder zwei Minuten.

Ich frage mich, ob es eine effizientere Möglichkeit zur Durchführung dieser Aufgabe gibt? Es scheint, dass die sep2 Option in fread sehr nützlich für dieses Problem sein wird, sobald es implementiert ist.

Danke!

> # Set up data.table 
> DT <- data.table(A = c("cat:1:meow", "dog:2:bark", "cow:3:moo"), 
        B = c("dog:3:meow", "dog:4:bark", "frog:3:croak"), 
        C = c("dingo:0:moo", "cat:8:croak", "frog:1:moo")) 
> print(DT) 

     A   B   C 
1: cat:1:meow dog:3:meow dingo:0:moo 
2: dog:2:bark dog:4:bark cat:8:croak 
3: cow:3:moo frog:3:croak frog:1:moo 

# grab the second delimited value in each cell 
> part_index <- 2 
> f = function(x) {vapply(t(x), function(x) {unlist(strsplit(x, ":", fixed=T))[part_index]}, character(1))} 

> sapply(DT, f) 

    A B C 
[1,] "1" "3" "0" 
[2,] "2" "4" "8" 
[3,] "3" "3" "1" 

Antwort

4

1) sub Diese Versuchen:

DT[, lapply(.SD, sub, pattern = ".*:(.*):.*", replacement = "\\1")] 

geben:

A B C 
1: 1 3 0 
2: 2 4 8 
3: 3 3 1 

2) fread oder mit fread:

DT[, lapply(.SD, function(x) fread(paste(x, collapse = "\n"))$V2)] 

3) Matrix Beachten Sie, dass ein ähnlicher Code mit einfacher Zeichenmatrix ohne data.table funktionieren würde:

m <- as.matrix(DT) 

replace(m, TRUE, sub(".*:(.*):.*", "\\1", m)) 

geben:

 A B C 
[1,] "1" "3" "0" 
[2,] "2" "4" "8" 
[3,] "3" "3" "1" 

3a) Noch einfacher (keine reguläre Ausdrücke) würde be:

replace(m, TRUE, read.table(text = m, sep = ":")$V2) 

3b) oder unter Verwendung fread von data.table:

replace(m, TRUE, fread(paste(m, collapse = "\n"))$V2) 
Verwandte Themen