2016-06-30 2 views
-2

Ich habe einen riesigen Datensatz von 1600 Reihen und 13 Spalten, alle drei Reihen präsentieren Daten einer einzelnen Person, während die Spalten Eigenschaften dieser Person sind. Ich möchte den Median aller Spalten für jede Person (3 Zeilen) erhalten.Wie kann ich den Mittelwert aller drei Zeilenintervalle für alle Spalten erhalten?

Zum Beispiel, von hier:

C1 C2 C3 C4 C5... 
R1 1 2 3 4 5 
R2 6 7 8 9 1 
R3 2 3 4 5 6 
R4 7 6 9 8 3 
R5 3 4 6 2 5 
R6 9 7 4 3 2 
R7 2 5 9 7 6 
R8 3 5 8 3 2 
R9 9 4 6 5 8 

Ich möchte folgendes erhalten:

C1 C2 C3 C4 C5 
R1 2 3 4 5 5 
R2 7 6 6 3 3 
R3 3 5 8 5 6 

. . .

+0

stellen Sie bitte maschinenlesbare Beispieldaten zur Verfügung, zum Beispiel indem Sie Rs dput() –

+0

Python oder R? Was ist dein Datenrahmen? –

+0

Es ist eine .csv-Datei, daher bin ich offen mit Python oder R-Code. –

Antwort

0

In R schaffen wir eine Gruppenvariable %/% verwenden und dann bekommen die median aller Spalten mit summarise_each

library(dplyr) 
df1 %>% 
    group_by(grp = ((row_number()-1)%/%3)+1) %>% 
    summarise_each(funs(median)) 
# grp C1 C2 C3 C4 C5 
# <dbl> <int> <int> <int> <int> <int> 
#1  1  2  3  4  5  5 
#2  2  7  6  6  3  3 
#3  3  3  5  8  5  6 

Oder mit data.table

library(data.table) 
setDT(df1)[, lapply(.SD, median) , .(grp =gl(nrow(df1), 3, nrow(df1)))] 
# grp C1 C2 C3 C4 C5 
#1: 1 2 3 4 5 5 
#2: 2 7 6 6 3 3 
#3: 3 3 5 8 5 6 

Oder mit aggregate von base R

aggregate(.~grp, transform(df1, grp = ((1:nrow(df1) -1) %/%3) + 1), median) 
# grp C1 C2 C3 C4 C5 
#1 1 2 3 4 5 5 
#2 2 7 6 6 3 3 
#3 3 3 5 8 5 6 
+1

Vielen Dank !!!! –

0

Sie können Ihre Daten in ein Array drehen und apply verwenden:

DF <- read.table(text = " C1 C2 C3 C4 C5 
       R1 1 2 3 4 5 
       R2 6 7 8 9 1 
       R3 2 3 4 5 6 
       R4 7 6 9 8 3 
       R5 3 4 6 2 5 
       R6 9 7 4 3 2 
       R7 2 5 9 7 6 
       R8 3 5 8 3 2 
       R9 9 4 6 5 8", header = TRUE) 

M <- as.matrix(DF) 
dim(M) <- c(3, nrow(M)/3, ncol(M)) 
apply(M, c(2, 3), median) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 2 3 4 5 5 
#[2,] 7 6 6 3 3 
#[3,] 3 5 8 5 6 
0

mein Versuch hier. Es wertet den Medianwert für alle drei Unterlisten aus. Der Medianwert wird aus der Summe der Elemente entnommen, die aus einer Zip-Datei der entpackten Teilliste stammen.

t =[[1, 2, 3, 4, 5], [6, 7, 8, 9, 1], ...... 

median = lambda subl: list(map(lambda n: sum(n)/len(subl), zip(*subl))) 

for i in range(0, len(t), 3): 
    print(median(t[i:i+3])) 
Verwandte Themen