Ich suche nach einer Möglichkeit, eine Funktion effizient auf jede Zeile von data.table anzuwenden. Lassen Sie sich die folgende Datentabelle berücksichtigen:Anwenden einer Funktion auf jede Zeile einer data.table
library(data.table)
library(stringr)
x <- data.table(a = c(1:3, 1), b = c('12 13', '14 15', '16 17', '18 19'))
> x
a b
1: 1 12 13
2: 2 14 15
3: 3 16 17
4: 1 18 19
Lassen Sie sich sagen, dass ich jedes Element der Spalte b
durch Raum geteilt werden soll (was somit zwei Zeilen für jede Zeile in den Originaldaten) und kommen Sie mit den resultierenden Datentabellen. Für das obige Beispiel, ich brauche das folgende Ergebnis:
a V1
1: 1 12
2: 1 13
3: 2 14
4: 2 15
5: 3 16
6: 3 17
7: 1 18
8: 1 19
Die folgende funktionieren würde, wenn Spalte a
nur eindeutige Werte hat:
x[, list(str_split(b, ' ')[[1]]), by = a]
Die folgende fast Werke (es sei denn, es gibt einige, identische Zeilen in der Originaldatentabelle), ist aber hässlich, wenn x
viele Spalten hat und Spalte b in das Ergebnis kopiert, was ich gerne vermeiden würde.
> x[, list(str_split(b, ' ')[[1]]), by = list(a,b)]
a b V1
1: 1 12 13 12
2: 1 12 13 13
3: 2 14 15 14
4: 2 14 15 15
5: 3 16 17 16
6: 3 16 17 17
7: 1 18 19 18
8: 1 18 19 19
Was wäre der effizienteste und idiomatische Weg, um dieses Problem zu lösen?
Dank Matthew - das funktioniert in meinem speziellen Beispiel (genau zwei Komponenten in jedem b, getrennt durch den Raum), würde aber nicht in einem allgemeineren Fall funktionieren, in dem jedes b 1 bis 10 Komponenten haben kann. Was zeigt, dass es schwierig ist, Ihre Frage genau zu spezifizieren :). –
@VictorK. Da gehst du. –
Matt, das ist eine perfekte Lösung, die viel Zeit gespart hat und sehr effizient arbeitet. Es zeigt, dass dein DT wirklich DF in r-base ersetzen muss. Ich zitiere dies in meiner Big Data Analytics-Klasse. Eine Frage, wie können wir es noch effizienter machen, indem wir es parallel auf Multi-Cores laufen lassen? Ich habe htop geprüft und ein Kern läuft. –