2016-04-04 13 views
2

Ich habe eine Datenrahmenmatrix in R, die ich durch die Summe der Spalten in absteigender Reihenfolge sortieren möchte. Meine Daten variieren von Werten von +1 bis -1. Ich habe diesen Code, das ist ziemlich perfekt funktioniert:Verwendung der Reihenfolge (colSums()) in R

DF<-DF[, order(colSums(-DF))] 

aber ich habe einige NA-Werte unter den Daten verteilt (keine einzelne Spalte oder Zeile ist alles, NA, so kann ich nicht einfach eine ganze Spalte oder Zeile entfernen) . Ich glaube, dass die Daten nicht richtig sortiert werden, da Spalten, die NAs enthalten, nicht sortiert und nur hinter den sortierten Spalten platziert werden.

Gibt es eine Möglichkeit, die Daten nach der Summe der Spalten wie oben zu sortieren, aber auch das Sortieren von Spalten mit NAs zu ermöglichen?

+0

Ja, kann man sich 'bestellen (c (1, NA, 3, NA))' und sehen, dass die nationalen Agenturen sind in der Tat die letzten Aufträge zugewiesen. Um das zu ändern, benutzen Sie vielleicht die 'na.last' Option, die in'? Order' erwähnt wird. '? colSums' zeigt, dass es eine 'na.rm'-Option hat, die Sie vielleicht möchten. Übrigens, [Datenrahmen] ist das falsche Tag für R. – Frank

Antwort

4

Wenn ich Sie richtig verstehe, möchten Sie "NA-Spalten" hinter "Nicht-NA-Spalten" sortieren, aber dann möchten Sie auch die NA-Spalten untereinander basierend auf dem Ergebnis von colSums() sortiert auf die Nicht-NA sortieren Zellen innerhalb der NA-Spalten. Sie können dies mit einem zusätzlichen Argument zu order() tun, um Verbindungen zu brechen, in denen Sie colSums() mit dem zusätzlichen Argument na.rm=TRUE aufrufen. Hier ist eine Demo mit 4 Spalten gesamt, 2 mit NAs, 2 ohne:

set.seed(3L) 
df <- setNames(rev(as.data.frame(replicate(4L, 
    sample(c(seq(-1,1,0.5),NA), 
      5L,rep=TRUE)))),letters[1:4]) 
df ## columns a and b are "NA columns", columns c and d are "non-NA columns" 
##  a b c d 
## 1 1.0 0.5 0.5 -0.5 
## 2 -1.0 0.5 -1.0 1.0 
## 3 1.0 0.5 -0.5 0.0 
## 4 NA 0.5 0.5 -0.5 
## 5 -0.5 NA 0.5 0.5 
colSums(-df) ## d should be moved before c, but can't tell yet about a and b 
## a b c d 
## NA NA 0.0 -0.5 
colSums(-df,na.rm=TRUE) ## this can tiebreak a and b; b should be moved before a 
## a b c d 
## -0.5 -2.0 0.0 -0.5 
df[,order(colSums(-df))] ## fails to order NA columns 
##  d c a b 
## 1 -0.5 0.5 1.0 0.5 
## 2 1.0 -1.0 -1.0 0.5 
## 3 0.0 -0.5 1.0 0.5 
## 4 -0.5 0.5 NA 0.5 
## 5 0.5 0.5 -0.5 NA 
df[,order(colSums(-df),colSums(-df,na.rm=TRUE))] ## tiebreaker orders NA columns properly 
##  d c b a 
## 1 -0.5 0.5 0.5 1.0 
## 2 1.0 -1.0 0.5 -1.0 
## 3 0.0 -0.5 0.5 1.0 
## 4 -0.5 0.5 0.5 NA 
## 5 0.5 0.5 NA -0.5 

Sorry, ich falsch verstanden. Sieht aus wie das ist, was Sie suchen:

df[,order(colSums(-df,na.rm=TRUE))] 
##  b a d c 
## 1 0.5 1.0 -0.5 0.5 
## 2 0.5 -1.0 1.0 -1.0 
## 3 0.5 1.0 0.0 -0.5 
## 4 0.5 NA -0.5 0.5 
## 5 NA -0.5 0.5 0.5 

Beachten Sie, dass na.rm=TRUE Übergang zur Behandlung von NAs als Null ist, im Gegensatz zu Ihrer Maßgabe, dass in Bezug auf NAs als Null würde vermasseln die Sortierung entspricht.

+0

Vielen Dank für eine so detaillierte Antwort. Eigentlich wollte ich die NA-Spalten gleich mit den Nicht-NA-Spalten sortieren, ich habe oben gesagt, dass die NA-Spalten hinter den Nicht-NA-Spalten platziert sind, aber das war nicht das, was ich wollte! Ich glaube, dass ich einfach das Argument "na.rm = T" in die colSums-Funktion gesetzt habe, was ich gesucht habe! –

+0

Entschuldigung, ich habe gerade festgestellt, dass die NAs, die Null sind, meine Sortierergebnisse nicht beeinflussen würden =) Prost! –

+0

Prost :) '' '' '' – bgoldst

0

Damit NA-Spalten gleichmäßig mit Nicht-NA-Spalten sortiert werden, verwenden Sie das Argument "na.rm = TRUE" in der Funktion "colSums". Dies überschreibt die ursprüngliche Reihenfolge von Spalten, in denen die NA-Spalten unsortiert hinter den sortierten Spalten liegen. Der letzte Code ist:

DF<-DF[, order(colSums(-DF, na.rm=T))]