ungeteilt Liste, merge Faktoren
-
27-10-2019 - |
Frage
Ich habe folgenden Datenrahmen in R:
c1 c2
1 10 a
2 20 a
3 30 b
4 40 b
I split
es dann wie folgt: z = lapply(split(test$c1, test$c2), function(x) {cut(x,2)})
. z
ist dann:
$a
[1] (9.99,15] (15,20]
Levels: (9.99,15] (15,20]
$b
[1] (30,35] (35,40]
Levels: (30,35] (35,40]
Ich möchte dann die Faktoren wieder zusammenführen, indem Sie die Liste unsplit(z, test$c2)
die Teilung aufgehoben wird. Dies erzeugt eine Warnung:
[1] (9.99,15] (15,20] <NA> <NA>
Levels: (9.99,15] (15,20]
Warning message:
In `[<-.factor`(`*tmp*`, i, value = 1:2) :
invalid factor level, NAs generated
Ich mag eine Vereinigung aller Faktorstufen nehmen und dann ungeteilt, so dass dieser Fehler nicht passiert:
z$a = factor(z$a, levels=c(levels(z$a), levels(z$b)))
unsplit(z, test$c2)
[1] (9.99,15] (15,20] (30,35] (35,40]
Levels: (9.99,15] (15,20] (30,35] (35,40]
In meinem realen Datenrahmen habe ich eine sehr große Liste, damit ich zu iterieren alle Listenelemente müssen (nicht nur zwei). Was ist der beste Weg, um dies?
zu tunLösung
Wenn ich Ihre Frage richtig verstanden, ich glaube, Sie machen dies etwas komplizierter als nötig. Hier ist eine Lösung mit plyr
. Wir werden durch die Gruppe c2
Variable:
require(plyr)
ddply(test, "c2", transform, newvar = cut(c1, 2))
die Rückgabe:
c1 c2 newvar
1 10 a (9.99,15]
2 20 a (15,20]
3 30 b (30,35]
4 40 b (35,40]
und hat eine Struktur:
'data.frame': 4 obs. of 3 variables:
$ c1 : num 10 20 30 40
$ c2 : Factor w/ 2 levels "a","b": 1 1 2 2
$ newvar: Factor w/ 4 levels "(9.99,15]","(15,20]",..: 1 2 3 4
Andere Tipps
Sie können nicht nur unlist()
z
statt?
> unlist(z)
a1 a2 b1 b2
(9.99,15] (15,20] (30,35] (35,40]
Levels: (9.99,15] (15,20] (30,35] (35,40]
oder ohne die Namen auf dem resultierenden Faktor:
> unlist(z, use.names=FALSE)
[1] (9.99,15] (15,20] (30,35] (35,40]
Levels: (9.99,15] (15,20] (30,35] (35,40]
Sie können alles zusammen in einen einfachen Einzeiler verschmelzen, die keine Add-on-Pakete benötigt:
> (test2 <- within(test, newvar <- unlist(lapply(split(c1, c2), cut, 2))))
c1 c2 newvar
1 10 a (9.99,15]
2 20 a (15,20]
3 30 b (30,35]
4 40 b (35,40]