Когда data.frame в R цифра c? - PullRequest
       23

Когда data.frame в R цифра c?

1 голос
/ 20 апреля 2020

Я наткнулся на следующую проблему. У меня есть data.frame

A <- data.frame(let = c("A", "B", "C"), x = 1:3, y = 4:6)

Классы его столбцов

sapply(A, class)
      let         x         y 
 "factor" "integer" "integer" 
s.numeric(A$x)
[1] TRUE
is.numeric(A)
[1] FALSE

Я не понимаю, почему, хотя A$x и B$x являются цифрами c, data.frame, составленный только из этих двух столбцов, не является цифрой c

is.numeric(A[, c("x", "y")])
[1] FALSE

Удаление столбца factor не помогает ...

B <- A
B$let <- NULL
is.numeric(B)
[1] FALSE
is.numeric(B$x)
[1] TRUE
is.numeric(B$y)
[1] TRUE

Итак, я попытался создать новый набор данных, построенный только с номерами c столбцов в A. Это цифра c? Нет ...

C <- data.frame(B$x, B$y)
is.numeric(C)
[1] FALSE
C <- data.frame(as.numeric(B$x), as.numeric(B$y))
is.numeric(C)
[1] FALSE

Должно быть, я чего-то здесь упускаю. Любая помощь?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2020

Кадр данных всегда является кадром данных, независимо от классов его столбцов. Таким образом, вы получите ожидаемое поведение

Если вы хотите проверить, все ли столбцы в фрейме данных являются цифрами c, вы можете использовать следующий код

all(sapply(A, is.numeric))
## [1] FALSE
all(sapply(A[, c("x", "y")], is.numeric))
## [1] TRUE

Таблица с только данные цифр c также могут пониматься как матрицы. Вы можете преобразовать цифры c столбцов вашего фрейма данных в матрицу следующим образом:

M <- as.matrix(A[, c("x", "y")])
M
##      x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6

Матрица M теперь действительно числится c:

is.numeric(M)
## [1] TRUE
3 голосов
/ 20 апреля 2020

Нам нужно применить функцию к vector, а не к data.frame

sapply(A[c("x", "y")], is.numeric)

вместо

is.numerc(A)

как в соответствии с ?is.numeric

Методы для is.numeri c должны возвращать true только в том случае, если базовый тип класса - double или integer, а значения можно разумно рассматривать как цифру c (например, арифметика c для них делает смысл, и сравнение должно быть сделано через базовый тип).

class для 'A' равно data.frame и не numeric

class(A)
#[1] "data.frame"

sapply(A, class)

is.numeric возвращает TRUE, только если class объекта равно numeric или integer.


Таким образом, data.frame никогда не может быть numeric, если мы не применим is.numeric на vector или извлеченном столбце. По этой причине мы делаем это для al oop с lapply/sapply, где мы получаем столбец как vector, а его класс будет классом этого столбца

...