2017-08-01 2 views
1

Entschuldigung, wenn es sich um ein Duplikat handelt, lassen Sie es mich bitte wissen, ich werde es gerne löschen.R Auswahl der Zelle mit der höchsten Anzahl von Zellen in Abhängigkeit von einer zweiten Spalte

Ich versuche, die vier höchsten Werte für verschiedene Werte einer anderen Spalte auszuwählen.

Datensatz:

A COUNT 
1 1  2 
2 1  6 
3 1  3 
4 1  9 
5 1  2 
6 1  7 
7 1  0 
8 1  5 
9 1  2 
10 1  7 
11 2  5 
12 2  1 
13 2  8 
14 2  9 
15 2  5 
16 2  2 
17 2  2 
18 2  4 
19 3  7 
20 3  5 
21 3  2 
22 3  8 
23 3  6 
24 3  1 
25 3  9 
26 3  5 
27 4  8 
28 4  1 
29 4  1 
30 4  3 
31 4  9 

Zum Beispiel würde Ich mag vier höchsten Werte auswählen, wenn A = 1 (9,7,7,6) dann, wenn A = 2 (9,8,5,5) und so weiter ...

Ich habe verschiedene Antworten auf 'Auswahl der höchsten Werte' gesucht, hatte aber Mühe, eine Beispielkonditionierung auf einer anderen Spalte zu finden.

Vielen Dank

Antwort

5

Sie könnten COUNT von A gespalten und dann die Top-4-Werte für jede Untergruppe

lapply(split(df$COUNT, df$A), function(x) head(sort(x, decreasing = TRUE), 4)) 
#$`1` 
#[1] 9 7 7 6 

#$`2` 
#[1] 9 8 5 5 

#$`3` 
#[1] 9 8 7 6 

#$`4` 
#[1] 9 8 3 1 

sapply Mit geben könnte eine freundlichere Ausgabe

sapply(split(df$COUNT, df$A), function(x) head(sort(x, decreasing = TRUE), 4)) 
#  1 2 3 4 
#[1,] 9 9 9 9 
#[2,] 7 8 8 8 
#[3,] 7 5 7 3 
#[4,] 6 5 6 1 
3

erhalten Sie können Aggregat verwenden:

aggr <- aggregate(COUNT~A,data=DF,function(x)head(sort(x,decreasing=TRUE),4)) 
> aggr 
    A COUNT.1 COUNT.2 COUNT.3 COUNT.4 
1 1  9  7  7  6 
2 2  9  8  5  5 
3 3  9  8  7  6 
4 4  9  8  3  1 
1
library(dplyr) 
new1 <- df %>% 
    group_by(A)%>% 
    summarise(y = tail(sort(COUNT),4)) 
+0

Ihr Code führt zu dieser Fehlermeldung: Fehler in summarise_impl (.Daten, Punkte): Spalte 'y' muss Länge 1 (ein Summenwert) sein, nicht 4 – www

1

Wir können zuerst durch A und absteigend von COUNT und der Scheibe des Datenrahmen zu halten, um die oberen 4 Reihen jeder Gruppe in A. dt2 den Datenrahmen ordnen ist der Ausgang von diesem.

library(dplyr) 
library(tidyr) 

dt2 <- dt %>% 
    arrange(A, desc(COUNT)) %>% 
    group_by(A) %>% 
    slice(1:4) 

Danach können wir auch den Datenrahmen vom langen Format in das breite Format ändern. dt3 ist die Ausgabe von diesem.

dt3 <- dt2 %>% 
    mutate(Count_Num = paste0("Count", 1:n())) %>% 
    spread(Count_Num, COUNT) 
1

Eine weitere Basis R Option ist tapply mit order und [

tapply(dat$COUNT, dat$A, function(x) x[order(-x)][1:4]) 
$`1` 
[1] 9 7 7 6 

$`2` 
[1] 9 8 5 5 

$`3` 
[1] 9 8 7 6 

$`4` 
[1] 9 8 3 1 

eine benannte Liste zurückzukehren.

mit by

by(dt$COUNT, dt$A, function(x) x[order(-x)][1:4]) 

erhalten Sie schönere Ausgabe auf dem Bildschirm.

Sie können beide in eine Matrix mit dem do.callrbind Paradigma. Zum Beispiel

do.call(rbind, by(dt$COUNT, dt$A, function(x) x[order(-x)][1:4])) 
    [,1] [,2] [,3] [,4] 
1 9 7 7 6 
2 9 8 5 5 
3 9 8 7 6 
4 9 8 3 1 

Mit data.table, könnten Sie tun

library(data.table) 
setDT(dat)[order(-COUNT), head(COUNT, 4), by="A"] 
    A V1 
1: 1 9 
2: 1 7 
3: 1 7 
4: 1 6 
5: 2 9 
6: 2 8 
7: 2 5 
8: 2 5 
9: 3 9 
10: 3 8 
11: 3 7 
12: 3 6 
13: 4 9 
14: 4 8 
15: 4 3 
16: 4 1 

eine data.table mit den Top-4-Werte zurück.

Verwandte Themen