2015-07-23 21 views
5

Jak uzyskać z dplyr minimalną (lub średnią) wartość każdego wiersza na data.frame? mam na myśli ten sam rezultat jakR dplyr oznacza wioskę lub min i inne metody?

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

próbowałam

mydataframe %>% rowwise() %>% mean 

lub

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

albo inne kombinacje, ale zawsze pojawiają się błędy, nie wiem właściwy sposób .

Wiem, że mogę również użyć rowMeans, ale nie ma prostego odpowiednika "rowMin". Istnieje również pakiet matrixStats, ale większość funkcji nie akceptuje danych.frames, tylko matryce.

Jeśli chcę obliczyć min rowwise mogę użyć
do.call (pmin, mydataframe) Czy jest coś tak proste dla rowwise oznacza?

do.call(mean, mydataframe) 

nie działa, myślę, że potrzebuję funkcji PMean lub czegoś bardziej złożonego.

Dzięki

W celu porównania wyników mogliśmy wszystkie prace na tym samym przykład:

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

Użyj 'mutate' zamiast' summarise', przy okazji 'do.call (pmin, mydataframe)' * jest * wiersz mądry 'mean'- spróbuj,' do.call (pmin, mtcars [c ("gear" , "carb")]) "na przykład, więc nie wiesz, o co Ci chodzi. –

+0

Czy możesz napisać pełne zdanie? A jak dodać opcje "średniej", na przykład na.rm = TRUE – skan

+1

Na przykład (dla datra 'mtcars'):' mtcars%>% rowwise()%>% do (data.frame (., res = mean (unlist (.), na.rm = TRUE))) ' –

Odpowiedz

4

Jak na ten temat?

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

Dla dodatkowej jasności, można dodać kolejny t() na koniec:

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

Czy możesz uzyskać coś tak prostego, ale przedstawiając wynikową kolumnę na oryginalnym data.frame? – skan

+0

Oblicza średnią dla każdego _kolumn_, a nie _również_! Więc nie odpowiada na pierwotne pytanie.I w ten sposób, 'summarise_each' jest w międzyczasie przestarzałe na rzecz bardziej szczegółowych' summarise_all' i 'summarise_at'. –

+0

@SalimB czy jesteś pewien? Mam transpose 't()', które zapewnia, że ​​podsumowujemy wiersze, a nie kolumny. Zaktualizuję niezrealizowaną wersję 'summarise_x' – JasonAizkalns

5

Przypuszczam, to jest to, co staraliśmy się osiągnąć:

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

Jak uniknąć określania każdej nazwy kolumny ?. Czasami masz za dużo. – skan

+0

@skan Myślałem, że 'df%>% rowwise()%>% mutate_ (Mean = min (names (df)))' powinno działać, ale nie, tylko pierwsza kolumna jest rozważana. A dla "znaczy" daje błąd. Nie mam pojęcia dlaczego, – Molx

+1

jeśli ktokolwiek może to naprawić, to byłoby ładniejsze rozwiązanie. – skan

0

Pomyśl znalazł rozwiązanie - po prostu przetransferuj swoje dane.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

Jeśli twoja ramka danych jest duża, transpozycja dwa razy wymaga długiego czasu i dużo pamięci. – skan

+0

Zgadzam się. Myślę, że to zależy od oczekiwań - używam tego podejścia do data.frames z kilkoma tysiącami wierszy i dziesiątkami kolumn i działa wystarczająco szybko. –

Powiązane problemy