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 tun
War es hilfreich?

Lö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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top