2009-09-29 9 views
7

Próbuję zaokrąglić wynik z prostej funkcji by() w R. Oto, co mam:Zaokrąglanie danych wyjściowych z funkcji w R

> by(glaciers[,1:3],glaciers$activity.level,mean) 

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
-9.444444e+00 1.771778e+03 3.247643e+09 
------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
1.041667e+01 2.067583e+03 4.048301e+09 
------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
1.766667e+01 2.168000e+03 2.759283e+09 

Jak mogę uzyskać wyniki w rundzie, aby powiedzieć 5 miejsc po przecinku, i nadal zachować czynniki?

Próbowałem: round(by(glaciers[,1:3],glaciers$activity.level,mean),5), ale otrzymałem komunikat o błędzie: Non-numeric argument to mathematical function.

+2

tylko dodać: wyjście z funkcji przez() jest „za” przedmiot, więc nie można zrobić rzeczy jak rundzie() do tego. – Shane

Odpowiedz

4
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 

UPDATE

Oto przykład roboczych:

glaciers <- as.data.frame(matrix(rnorm(1000),ncol=4)) 
glaciers[,4] <- sample(0:3,250,replace=TRUE) 
colnames(glaciers) <- c("A","B","C","activity.level") 
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 
+0

Rob, Próbowałem również tej metody, ale nadal otrzymuję nie zaokrąglone liczby z wykładnikami jak powyżej. Nie wiem, dlaczego funkcja round() przechodzi. –

+0

Grałem z tym więcej i okazało się, że jeśli zaokrąglę o .5, to znaczy, że faktycznie zaokrągli, ale tylko do 1 miejsca po przecinku. Chcę zaokrąglić, aby podać 3-5 miejsc po przecinku, ale użycie liczby całkowitej nie wydaje się tego robić. –

+0

Nie wiem, co robisz. Zaktualizowałem swoją odpowiedź, dodając działający przykład. –

10

Jeśli masz już wyjścia zapisywane do zmiennej, powiedzmy x:

x <- by(glaciers[,1:3],glaciers$activity.level,mean) 

Następnie zastosuj round() do każdego elementu (wyjście z by() w tym przypadku jest listą).

x[] <- lapply(x,round,5) 
x 

realokacja-X [] zamiast X zapewnia x zachowują cechy zamocowane do niego w drodze().

Edytuj: round() faktycznie zmienia wartość zmiennych, ale jest odsprzęgnięty od drukowania. Jeśli chcesz, aby stłumić naukowy format wyjściowy notacji, użyj format = „f” argument formatC()

> round(1.2345e10,5) 
[1] 1.2345e+10 
> formatC(1.2345e10,digits=5,format="f") 
[1] "12345000000.00000" 

więc korekta do wyrażenia Cytat byłoby

x[] <- lapply(x,formatC,digits=5,format="f") 
+0

Stephen, Próbowałem tej metody, ale nadal otrzymuję non -przepisane liczby z wyjściami wykładniczymi jak powyżej. Jakieś pomysły? –

1

Chcesz zaokrąglić lub po prostu skrócić liczbę wyświetlanych cyfr? Jeśli to drugie, użyj opcji (cyfry = 3) lub cokolwiek innego.

> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
    cty hwy 
21.012 28.802 
------------------------------------------------------------ 
mpg$cyl: 5 
    cty hwy 
20.50 28.75 
------------------------------------------------------------ 
mpg$cyl: 6 
    cty hwy 
16.215 22.823 
------------------------------------------------------------ 
mpg$cyl: 8 
    cty hwy 
12.571 17.629 
> options(digits=3) 
> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
cty hwy 
21.0 28.8 
------------------------------------------------------------ 
mpg$cyl: 5 
cty hwy 
20.5 28.8 
------------------------------------------------------------ 
mpg$cyl: 6 
cty hwy 
16.2 22.8 
------------------------------------------------------------ 
mpg$cyl: 8 
cty hwy 
12.6 17.6 
1

mają tylko kilka minut, ale można spróbować patrząc na format(), formatC() i prettyNum() funkcji. Ich pliki pomocy wyglądają teraz jak bełkot, ale nie spałem zbyt wiele. Jednak użyłem jednej z tych funkcji - najprawdopodobniej formatC() - dla raportu Sweave kilka miesięcy temu, w którym potrzebowałem bardzo dokładnie sformatowanych liczb.

+0

Aby wyjaśnić: musisz umieścić go w funkcji by(), jak Rob i Stephen zrobili z round(). –

6

round() nie ma sensu w tym przypadku, ponieważ pracujesz z bardzo dużymi numebrami. Chcesz użyć polecenia format() i wybrać liczbę wyświetlanych cyfr. Na przykład, aby pokazać 3 cyfr znaczących:

by(glaciers[,1:3], glaciers$activity.level, function(x) { 
     as.numeric(format(mean(x), digits=3)) 
}) 
2

Pytałeś „Jak mogę dostać moje wyjście do zaokrąglić do 5 miejsc po przecinku powiedzieć?” ale myślę, że chodziło Ci o to "Jak mogę pokazać moje wyniki za 6 znaczących liczb?" Poniższy kod łączy dwie z poprzednich odpowiedzi - ideę ponownego przypisania do res [] i użycia oznaczenia zamiast okrągłego.

glaciers <- data.frame(aspect=runif(20)*100, 
         sun.duration=runif(20)*10000, 
         latitude=runif(20)*10^9, 
         activity.level=sample(c('Active','Inactive','Relict'),20,replace=TRUE)) 
res <- by(glaciers[,1:3],glaciers$activity.level,mean) 
res[] <- lapply(res,signif,3) 
res 

Ten kod daje następujący wynik:

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
    3.66e+01  4.72e+03  4.56e+08 
------------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
    5.81e+01  5.28e+03  4.83e+08 
------------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
    6.08e+01  4.75e+03  3.98e+08 
Powiązane problemy