2013-04-16 13 views
10

mam ramki danych:Oblicz wierszami proporcje

x <- data.frame(id = letters[1:3], val0 = 1:3, val1 = 4:6, val2 = 7:9) 
# id val0 val1 val2 
# 1 a 1 4 7 
# 2 b 2 5 8 
# 3 c 3 6 9 

w obrębie każdego rzędu, że aby obliczyć odpowiednie proporcje (ratio) dla każdej z nich. Na przykład. dla wartości w kolumnie "val0", chcę obliczyć wartość w wierszu val0/(val0 + val1 + val2).

Pożądany wyjściowa:

id  val0 val1 val2 
1 a 0.083 0.33 0.583 
2 b 0.133 0.33 0.533 
3 c 0.167 0.33 0.5 

Czy ktoś może mi powiedzieć, co jest najlepszym sposobem, aby to zrobić? Tutaj są tylko trzy kolumny, ale może być wiele kolumn.

Odpowiedz

4

a inna alternatywa (choć jest to głównie dość wersja sweep) ... prop.table:

> cbind(x[1], prop.table(as.matrix(x[-1]), margin = 1)) 
    id  val0  val1  val2 
1 a 0.08333333 0.3333333 0.5833333 
2 b 0.13333333 0.3333333 0.5333333 
3 c 0.16666667 0.3333333 0.5000000 

Z "de SCRIPTION sekcja”z pliku pomocy w ?prop.table:

To naprawdę sweep(x, margin, margin.table(x, margin), "/") dla początkujących, z wyjątkiem, że jeśli margines ma zerową długość, a następnie jeden dostaje x/suma (x).

Widać więc, że pod spodem jest to bardzo podobne do rozwiązania @ Jilber.

I ... miło jest, jeśli programiści R uważają nas za początkujących, prawda? :)

+0

+1 Bardzo ładne użycie 'prop.table' –

+1

@Jilber, Dzięki. Właściwie to zainspirowało cię twoje rozwiązanie, ponieważ zawsze pamiętam opis 'prop.table', zaczynając od stwierdzenia, że ​​jest to" zamiatanie "dla początkujących (którym jestem, wiecznie). – A5C1D2H2I1M1N2O1R2T1

7

następujące powinny rade

cbind(id = x[, 1], x[, -1]/rowSums(x[, -1])) 
## id  val0  val1  val2 
## 1 a 0.08333333 0.3333333 0.5833333 
## 2 b 0.13333333 0.3333333 0.5333333 
## 3 c 0.16666667 0.3333333 0.5000000 
5

Inną alternatywą użyciu sweep

sweep(x[,-1], 1, rowSums(x[,-1]), FUN="/") 
     val0  val1  val2 
1 0.08333333 0.3333333 0.5833333 
2 0.13333333 0.3333333 0.5333333 
3 0.16666667 0.3333333 0.5000000 
1

Funkcja ns_to_percents z pakietu dozorca robi to:

library(janitor) 
ns_to_percents(x) 

    id  val0  val1  val2 
1 a 0.08333333 0.3333333 0.5833333 
2 b 0.13333333 0.3333333 0.5333333 
3 c 0.16666667 0.3333333 0.5000000 

Jest to odpowiednik ns_to_percents(x, denom = "row"), choć "row" jest domyślnym argumentem, więc nie jest potrzebne w tym przykładzie.

Jeśli wyświetlasz wynik, możesz preferować janitor::adorn_crosstab.

Nota prawna: Stworzyłem pakiet dla woźnych, ale uważam, że należy to opublikować; funkcja została zbudowana, aby wykonać dokładnie to zadanie, jednocześnie czyniąc kod czytelniejszym do odczytania, a pakiet można zainstalować z CRAN.