2015-07-23 14 views
5

Come posso ottenere con dplyr il valore minimo (o medio) di ogni riga su un data.frame? voglio dire lo stesso risultato diR dplyr meanwise mean or min e altri metodi?

apply(mydataframe, 1, mean) 
apply(mydataframe, 1, min) 

Ho provato

mydataframe %>% rowwise() %>% mean 

o

mydataframe %>% rowwise() %>% summarise(mean) 

o altre combinazioni, ma ottengo sempre gli errori, non so il modo corretto .

So che potrei usare anche rowMeans, ma non esiste un semplice equivalente "rowMin". Esiste anche un pacchetto matrixStats ma la maggior parte delle funzioni non accetta data.frames, solo matrici.

Se voglio calcolare il minimo rowwise ho potuto usare
do.call (Pmin, mydataframe) C'è qualcosa di semplice come questo per il rowwise significa?

do.call(mean, mydataframe) 

non funziona, suppongo di aver bisogno di una funzione di pmean o qualcosa di più complesso.

Grazie

Al fine di confrontare i risultati che potremmo lavorare tutti sullo stesso esempio:

set.seed(124) 
df <- data.frame(A=rnorm(10), B=rnorm(10), C=rnorm(10)) 
+0

Usa 'mutate' invece di' sumarise', tra l'altro 'do.call (pmin, mydataframe)' * è * a row wise 'mean'- prova,' do.call (pmin, mtcars [c ("gear" , "carb")])) ad esempio, quindi non sei sicuro di quale sia il tuo problema –

+0

Potresti scrivere la frase completa, per favore? E come includi le opzioni per "media", ad esempio na.rm = TRUE – skan

+1

Ad esempio, (per il datra 'mtcars'):' mtcars%>% rowwise()%>% do (data.frame (., res = mean (unlist (.), na.rm = TRUE))) ' –

risposta

4

ne dici di questo?

library(dplyr) 
as.data.frame(t(mtcars)) %>% 
    summarise_all(funs(mean)) 

Per chiarezza in più, si potrebbe aggiungere un altro t() alla fine:

as.data.frame(t(mtcars)) %>% 
    summarise_all(funs(mean)) %>% 
    t() 
+0

Potresti ottenere qualcosa di semplice ma introducendo la colonna risultante sul data.frame originale? – skan

+0

Calcola la media per ogni _column_, non _row_! Quindi non risponde alla domanda originale.E btw, 'sumarise_each' è nel frattempo deprecato a favore del più specifico' summarise_all' e 'summarise_at'. –

+0

@SalimB sei sicuro? Ho una trasposizione 't()' lì che garantisce che stiamo riassumendo le righe e non le colonne. Aggiornerò la versione non deprecata di 'summarise_x' – JasonAizkalns

5

Suppongo che questo è quello che stavi cercando di realizzare:

df <- data.frame(A=rnorm(10), B=rnorm(10), C=rnorm(10)) 

library(dplyr) 
df %>% rowwise() %>% mutate(Min = min(A, B, C), Mean = mean(c(A, B, C))) 

#    A   B   C  Min  Mean 
# 1 1.3720142 0.2156418 0.61260582 0.2156418 0.73342060 
# 2 -1.4265665 -0.2090585 -0.05978302 -1.4265665 -0.56513600 
# 3 0.6801410 1.5695065 -2.70446924 -2.7044692 -0.15160724 
# 4 0.0335067 0.8367425 -0.83621791 -0.8362179 0.01134377 
# 5 -0.2068252 -0.2305140 0.23764322 -0.2305140 -0.06656532 
# 6 -0.3571095 -0.8776854 -0.80199141 -0.8776854 -0.67892877 
# 7 1.0667424 -0.6376245 -0.41189564 -0.6376245 0.00574078 
# 8 -1.0003376 -1.5985281 0.90406055 -1.5985281 -0.56493504 
# 9 -0.8218494 1.1100531 -1.12477401 -1.1247740 -0.27885677 
# 10 0.7868666 0.6099156 -0.58994138 -0.5899414 0.26894694 
+3

Come evitare di specificare ogni nome di colonna ?. A volte ne hai troppi. – skan

+0

@skan Ho pensato che 'df%>% rowwise()%>% mutate_ (Mean = min (names (df)))' dovrebbe funzionare, ma non lo fa, solo la prima colonna è considerata. E per 'mean' emette un errore. Non so perché, – Molx

+1

se qualcuno può aggiustarlo sarebbe la soluzione migliore – skan

0

Pensate trovato una soluzione - basta trasporre i tuoi dati.frame:

x <- data_frame(x = rnorm(10), 
      y = rnorm(10)) 

# A tibble: 10 × 2 
     x    y 
    <dbl>   <dbl> 
1 -1.1240392 0.9306028477 
2 -0.8213379 0.2500495105 
3 -0.8289104 -0.3693704483 
4 -0.6486601 -1.1421141986 
5 0.5098542 -0.3703368343 
6 -0.3644690 -0.0003744377 
7 0.7404057 0.1166905738 
8 -0.2475214 -0.0802864865 
9 0.2637841 -0.7717699521 
10 1.4092874 0.2998021578 

x %>% 
    t() %>% 
    data.frame() %>% 
    mutate_all(funs(min)) %>% 
    unique() %>% 
    t() 

     1 
X1 -1.1240392 
X2 -0.8213379 
X3 -0.8289104 
X4 -1.1421142 
X5 -0.3703368 
X6 -0.3644690 
X7 0.1166906 
X8 -0.2475214 
X9 -0.7717700 
X10 0.2998022 
+0

Se il proprio dataframe è di grandi dimensioni, il trasferimento richiede due volte un lungo molta memoria – skan

+0

Accetto. Penso che dipenda dalle aspettative - sto usando questo approccio su data.frames con parecchie migliaia di righe e decine di colonne e funziona abbastanza velocemente. –