2017-11-02 1 views
1

I von abs(((column A - column B)/column A)*100)berechnen Mittelwert der berechneten Werte

den Mittelwert der resultierenden Werte zurück berechnen möchte ich versuchen:

> mtcars 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
... 

mean((abs(mtcars['cyl']-mtcars['mpg'])/mtcars['mpg'])*100) 

Was mich Fehler gibt:

Warning message: In mean.default((abs(mtcars["cyl"] - mtcars["mpg"])/mtcars["mpg"]) * : argument is not numeric or logical: returning NA

Wie kann ich das beheben?

+0

Keine Notwendigkeit für die doppelte Klammern am Anfang (und verwenden Sie $ als @Sotos Antwort): 'bedeuten (abs (mtcars $ cyl - mtcars $ mpg)/mtcars $ mpg) * 100'. – neilfws

Antwort

3

Sie müssen $ Operator verwenden, um die Werte als Vektoren zu extrahieren oder Doppelklammern verwenden, dh

mean((abs(mtcars[['cyl']]-mtcars[['mpg']])/mtcars[['mpg']])*100) 
#[1] 64.13455 

#or 

mean((abs(mtcars$cyl-mtcars$mpg)/mtcars$mpg)*100) 
#[1] 64.13455 

man den Unterschied in der Struktur sehen,

str(mtcars['cyl']) 
'data.frame': 32 obs. of 1 variable: 
$ cyl: num 6 6 4 6 8 6 8 4 4 6 ... 

str(mtcars[['cyl']]) 
num [1:32] 6 6 4 6 8 6 8 4 4 6 ... 

str(mtcars$cyl) 
num [1:32] 6 6 4 6 8 6 8 4 4 6 ... 
1

A tidyverse alternative:

library(dplyr) 
mtcars %>% 
    summarise(Mean = mean(abs(cyl - mpg)/mpg) * 100) 

     Mean 
1 64.13455 
Verwandte Themen