Для l oop в R возвращается null? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть набор данных под названием ecr, который отображает обменные курсы разных валют. Я хочу написать функцию, которая заменяет каждое значение (в рупиях, фунтах, евро и т. Д. c.) На стандартное отклонение от среднего. Я написал это для начала, специально для Австралии:

Aus_sds <- for(i in ecr$Australia) {
(i-mean(ecr$Australia))/sd(ecr$Australia)
}

, но Aus_sds имеет значение NULL. С другой стороны, (ecr$Australia[1]-mean(ecr$Australia))/sd(ecr$Australia) отлично работает для любого значения в скобках. Что я не понимаю для циклов в R?

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Похоже, вы намерены захватить вектор значений (z-значения).

  1. for циклы возвращают NULL. Всегда. Незримо. Таким образом, anyvariable <- for (...) { ... } всегда будет NULL.

  2. Как правило, , можно использовать sapply, чтобы делать то, что вам нужно:

    sapply(mtcars$disp, function(x) (x - mean(mtcars$disp)) / sd(mtcars$disp))
    #  [1] -0.5706 -0.5706 -0.9902  0.2201  1.0431 -0.0462  1.0431 -0.6779 -0.7255 -0.5093 -0.5093  0.3637
    # [13]  0.3637  0.3637  1.9468  1.8499  1.6886 -1.2266 -1.2508 -1.2879 -0.8926  0.7042  0.5912  0.9624
    # [25]  1.3658 -1.2242 -0.8909 -1.0943  0.9705 -0.6916  0.5670 -0.8853
    
  3. Однако, в данном случае , вы можете воспользоваться векторизацией R:

    (mtcars$disp - mean(mtcars$disp)) / sd(mtcars$disp)
    #  [1] -0.5706 -0.5706 -0.9902  0.2201  1.0431 -0.0462  1.0431 -0.6779 -0.7255 -0.5093 -0.5093  0.3637
    # [13]  0.3637  0.3637  1.9468  1.8499  1.6886 -1.2266 -1.2508 -1.2879 -0.8926  0.7042  0.5912  0.9624
    # [25]  1.3658 -1.2242 -0.8909 -1.0943  0.9705 -0.6916  0.5670 -0.8853
    

    Нет for l oop требуется . Вызовы mean(...) и sd(...) будут уменьшены до одного значения каждый, что эквивалентно (x - mu)/sigma, где x - вектор, а каждый из mu и sigma - скаляры.

И вуаля, у вас есть z-значения.

1 голос
/ 13 июля 2020

Также вы можете избежать многих функций, используя scale(). Давайте покажем концепцию с данными mtcars. Эта функция делает то, что вы хотите, центрируя переменные относительно среднего и делая значения стандартными до 1.

df <- scale(mtcars)

apply(df,2,mean)

          mpg           cyl          disp            hp          drat            wt          qsec            vs 
 7.112366e-17 -1.474515e-17 -9.084937e-17  1.040834e-17 -2.918672e-16  4.681043e-17  5.299580e-16  6.938894e-18 
           am          gear          carb 
 4.510281e-17 -3.469447e-18  3.165870e-17 

apply(df,2,sd)

mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
   1    1    1    1    1    1    1    1    1    1    1 

Как вы можете видеть, все переменные имеют нулевое среднее значение и единицу sd.

Этого можно избежать используя петли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...