2016-04-09 8 views
0

Erste Post.Wie summiert man die 30% höchste Nummer in einer Spalte in Gruppen

Wie in der Überschrift gesagt. Ich kann es mit der Teilmengefunktion tun, aber ich würde ddply benutzen, das ich nicht zur Arbeit bekommen kann.

Zum Beispiel möchte ich die 33,33% höchste Anzahl von Änderungen für alle Männer, die Placebo nehmen: -1,7, -1,5, -1,1 = 4,3, und so weiter für alle verschiedenen Kombinationen summieren.

Um es ein bisschen komplizierter zu machen: Wenn es mit den 33,33% nicht schön wird (zum Beispiel wenn es 10 Datenpunkte gibt), würde ich gerne den halben Durchschnitt bekommen (oder 0,25 wenn es nur 9 sind Datenpunkte) der zwei Zahlen dazwischen.

Mein realer Datensatz ist viel größer, also würde mir ddply viel Zeit ersparen. Irgendwelche Vorschläge?

data <- read.table(header=TRUE, text=' 
subject sex condition before after change 
     1 F placebo 10.1 6.9 -3.2 
     2 F placebo 6.3 4.2 -2.1 
     3 M aspirin 12.4 6.3 -6.1 
     4 F placebo 8.1 6.1 -2.0 
     5 M aspirin 15.2 9.9 -5.3 
     6 F aspirin 10.9 7.0 -3.9 
     7 F aspirin 11.6 8.5 -3.1 
     8 M aspirin 9.5 3.0 -6.5 
     9 F placebo 11.5 9.0 -2.5 
     10 M placebo 11.9 11.0 -0.9 
     11 F aspirin 11.4 8.0 -3.4 
     12 M aspirin 10.0 4.4 -5.6 
     13 M aspirin 12.5 5.4 -7.1 
     14 M placebo 10.6 10.6 0.0 
     15 M aspirin 9.1 4.3 -4.8 
     16 F placebo 12.1 10.2 -1.9 
     17 F placebo 11.0 8.8 -2.2 
     18 F placebo 11.9 10.2 -1.7 
     19 M aspirin 9.1 3.6 -5.5 
     20 M placebo 13.5 12.4 -1.1 
     21 M aspirin 12.0 7.5 -4.5 
     22 F placebo 9.1 7.6 -1.5 
     23 M placebo 9.9 8.0 -1.9 
     24 F placebo 7.6 5.2 -2.4 
     25 F placebo 11.8 9.7 -2.1 
     26 F placebo 11.8 10.7 -1.1 
     27 F aspirin 10.1 7.9 -2.2 
     28 M aspirin 11.6 8.3 -3.3 
     29 F aspirin 11.3 6.8 -4.5 
     30 F placebo 10.3 8.3 -2.0 
') 
+0

Ist die ** Änderung ** garantiert negativ? Oder müssen wir die Summe der absoluten Werte von ** change ** finden? –

+0

Kannst du mir bitte erklären, was meinst du mit diesem Ding: _ Ich möchte den halben Durchschnitt (oder .25, wenn es nur 9 Datenpunkte gibt) der zwei Zahlen dazwischen bekommen. _ Mit einem Beispiel? –

Antwort

0

nicht sicher, was Sie ddply unter Verwendung gewinnen würde, ist hier ein Vorschlag Basis R mit:

mean33 <- function(x) mean(sort(x, decreasing=TRUE)[seq(1, length.out=length(x)/3)]) 
tapply(df$change, df$condition, mean33) 
# aspirin placebo 
# -3.18 -1.05 

Damit es schneller Sie sort.int statt sort könnten versuchen - und auf jeden Fall die gleiche Funktion würde arbeite mit ddply.

ich nicht ganz die Idee bekommen ...

Um es etwas komplizierter: wenn es nicht schön bis fügt mit das 33,33% (zum Beispiel, wenn gibt es 10 Datenpunkte), Würde ich gerne bekommen die Hälfte des Durchschnitts (oder .25, wenn es nur 9 Datenpunkte) der zwei Zahlen dazwischen.

(9 lässt sich sehr schön durch 3 geteilt werden ..)

... so dass ich nicht versuchen, sie umzusetzen. Gegenwärtig werden die oberen 1/3 verwendet, aber etwas weniger, wenn N nicht gleichmäßig durch 3 teilbar ist (length.out nimmt den ganzzahligen Teil der Länge (x)/3).

0

Mit dplyr (ich glaube, ein besseres Paket), können Sie etwas tun:

library(dplyr) 
data %>% group_by(sex, condition) %>% arrange(desc(change)) %>% summarise(sumChange = sum(change[1:floor(n()/ifelse(n() > 10, 3, 4))])) 

Blick auf die bedingten fraktionierte Berechnung. Sie können das ändern, was Sie wollen. Darüber hinaus können Sie mehrere ifelse-Anweisungen verschachteln.

Hinweis: Sie sagten zusammenfassend ... so habe ich sum verwendet. Sie können ebenso einfach andere Funktionen wie mean ersetzen. Beachten Sie auch, dass Sie die höchsten Zahlen angegeben haben. Also habe ich eine absteigende Reihenfolge gemacht. Sie können es umkehren, wenn Sie den größten Unterschied von Null bedeuteten.

Verwandte Themen