Почему базовый масштаб не работает с Tibble? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть набор данных, который я импортировал из Excel, используя readxl, который называется GSMA. Проверка класса объекта возвращает:

    class(GSMA)
[1] "tbl_df"     "tbl"        "data.frame"

Я хочу стандартизировать столбцы со 2 по 4, используя базовый масштаб. Я пытаюсь запустить:

GSMA[2:4] <- scale(GSMA[2:4])

В результате получается некорректно масштабированный фрейм данных, в котором каждая строка имеет одинаковое значение для всех столбцов.

Потенциальный ключ к проблеме: Когда я пытаюсь отсортировать неправильно масштабированный фрейм данных, эта ошибка возвращается:

Error in xj[i, , drop = FALSE] : subscript out of bounds

Когда я повторно импортирую тот же набор данных, а затем запускаю:

GSMA <- as.data.frame(GSMA)
GSMA[2:4] <- scale(GSMA[2:4])

Столбцы фрейма данных масштабируются правильно.

Что происходит? Почему базовый масштаб не работает в первом случае?

dput(head(GSMA))

structure(list(Country = c("GBR", "CHE", "DEU", "ROU", "LUX", 
"KAZ"), entry = c(98.4974384307861, 95.6549962361654, 91.4044539133708, 
90.8518393834432, 90.4088099797567, 88.0471547444662), medium = c(86.0081672668457, 
93.0372142791748, 91.2993144989014, 100, 96.7348480224609, 100
), high = c(74.6774760159579, 84.1793060302734, 79.542350769043, 
99.6931856328791, 97.031680020419, 92.5396745855158)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

странно, это правильно:

> scale(head(GSMA[2:4]))
          entry     medium       high
[1,]  1.5644225 -1.5528676 -1.3233285
[2,]  0.8257534 -0.2694974 -0.3755223
[3,] -0.2788406 -0.5868048 -0.8380579
[4,] -0.4224492  1.0017748  1.1719851
[5,] -0.5375798  0.4056202  0.9065003
[6,] -1.1513063  1.0017748  0.4584233
attr(,"scaled:center")
   entry   medium     high 
92.47745 94.51326 87.94395 
attr(,"scaled:scale")
    entry    medium      high 
 3.848059  5.477022 10.025077 

, но это не так:

> GSMA[2:4] <- scale(GSMA[2:4])
> head(GSMA)
# A tibble: 6 x 4
  Country entry[,"entry"] [,"medium"] [,"high"] medium[,"entry"] [,"medium"] [,"high"]
  <chr>             <dbl>       <dbl>     <dbl>            <dbl>       <dbl>     <dbl>
1 GBR                2.13        1.25     0.870             2.13        1.25     0.870
2 CHE                2.00        1.52     1.27              2.00        1.52     1.27 
3 DEU                1.80        1.46     1.07              1.80        1.46     1.07 
4 ROU                1.78        1.80     1.92              1.78        1.80     1.92 
5 LUX                1.76        1.67     1.81              1.76        1.67     1.81 
6 KAZ                1.65        1.80     1.62              1.65        1.80     1.62 
# ... with 3 more variables: high[,"entry"] <dbl>, [,"medium"] <dbl>, [,"high"] <dbl>

1 Ответ

0 голосов
/ 15 апреля 2020

Известная проблема с Tibble 3.0.0. Вернитесь к 2.1.3 для старого поведения.

Или:

library(tibble)
iris <- as_tibble(iris)
scale <- scale(iris[1:3])
class(scale)
#> [1] "matrix"
iris[1:3] <- as.data.frame(scale)
...