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.
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