2017-02-06 3 views
-1

Ich habe ein data.frame die wie folgt aussieht:Bedingtes Zahlen entfernen und zusammenfassende Statistiken berechnen

Col1  Col2  Col3  Mean  
    5   6  5  5.3  
    3   7  9  6.3  
    1   3  4  2.6  

Ich möchte reihenweise die Nummer entfernen, die mehr von dem Mittelwert jeder Reihe unterscheidet und re- Berechnen Sie den Mittelwert mit den verbleibenden zwei Zahlen.

Kann mir bitte jemand helfen?

Dank im Voraus

+3

Könnten Sie bitte auch Ihre erwartete Ausgabe hinzufügen? –

Antwort

1

Daten

df = read.csv(text = "Col1,Col2,Col3,Mean 
         5,6,5,5.3 
         3,7,9,6.3 
         1,3,4,2.6", header = TRUE) 

Entfernen Sie die Werte für jede Zeile, die am weitesten vom Zeilenmittelpunkt entfernt ist Erstellen Sie einen neuen Datenrahmen

df2 = t(apply(df[,1:3], 1, function(x) x[-which.max(abs(x-mean(x)))])) 

berechnen rowMeans für die Zeilen in df2

df2 = cbind(df2,Mean = rowMeans(df2)) 
3

wir die Elemente in den ersten 3 Spalten festlegen, die größer ist als die ‚mittlere‘ Spalte ‚NA‘, so ist die Reihenmittel neu berechnen (rowMeans) auf den neuen Werten basieren und zuordnen es 'mean' Spalte

df1[1:3][df1[1:3] > df1$Mean] <- NA 
df1$Mean <- rowMeans(df1[1:3], na.rm = TRUE) 

Oder in einer einzigen Zeile

df1$Mean <- rowMeans(replace(df1[1:3], df1[1:3] > df1$Mean, NA), na.rm = TRUE) 

Oder wie @Alexey Ferapontov erwähnt, könnte die Logik unterschiedlich sein

df1[cbind(1:nrow(df1), max.col(df1[1:3]- df1$Mean, "first"))] <- NA 
rowMeans(df1[1:3], na.rm = TRUE) 
+3

Ich denke, der Autor musste Elemente entfernen, die den größten Unterschied zum Mittelwert haben. Z.B. in Zeile 3 wäre es "1" (1,6 Diff), nicht "4" (1,4 Diff) –

4

konnte mit dplyr/tidyr wie so geschehen: generieren Datenrahmen in Frage:

df<-data.frame(Col1=sample(1:10,3),Col2=sample(1:10,3),Col3=sample(1:10,3))%>%mutate(Mean=rowMeans(.)) 

Zum Beispiel:

>df 
    Col1 Col2 Col3  Mean 
1 6 10 3 6.333333 
2 7 6 1 4.666667 
3 9 4 4 5.666667 

Dann gather die Spalten, verwenden Sie die Conditio n filter, spread die resultierende tbl_df in der ursprünglichen Form, select alles, aber die mittleren Spalte und neu berechnen rowMeans:

df_fin<-df%>%gather(Cols,value,Col1:Col3)%>%filter(value>Mean)%>%spread(Cols, value)%>%select(-Mean)%>%mutate(newMean=rowMeans(.,na.rm=TRUE)) 

Dies gibt Ihnen:

> df_fin 
    Col1 Col2 newMean 
1 7 6  6.5 
2 9 NA  9.0 
3 NA 10 10.0 
Verwandte Themen