извините за довольно элементарные вопросы, но я не смог легко найти какие-либо ответы, а также просто хочу получить твердое подтверждение по вещам.
У меня есть фрейм данных, который содержит числовые, факторные и упорядоченные факторные переменные, и когда я преобразовал его в матрицу, используя as.matrix, я заметил, что все элементы матрицы были символами. Из этого опыта у меня есть 2 вопроса;
Во-первых, прав ли я, говоря, что векторы и матрицы могут содержать только один тип данных, и поэтому происходит приведение?
Во-вторых, и что более важно, какие комбинации типов данных во фрейме данных приводят к символьным матрицам по сравнению с числовыми матрицами и т. д.? например Если бы в моем df были только логические, целочисленные и числовые типы, я думаю, что получил бы числовую матрицу, это правильно? Так это просто включение факторов, упорядоченных факторов и/или символов в мой фрейм данных, который при преобразовании в матрицу приводит к принуждению каждого элемента к символу?
Большое спасибо за чтение, любая помощь приветствуется :]
Ответ на первый вопрос: да и нет.
На самом деле матрица — это вектор с атрибутом dim
.
И вектор должен обычно иметь только один тип данных. list
является исключением: это vector
с режимом list
, и список также может иметь атрибут dim
.
Например:
> is.vector(list(1, "a", T))
[1] TRUE
> mode(list(1, "a", T))
[1] "list"
> a <- structure(list(1, "a", T, 1+2i), dim = c(2, 2))
> is.matrix(a)
[1] TRUE
> a
[,1] [,2]
[1,] 1 TRUE
[2,] "a" 1+2i
Но все же наверное причина as.matrix
делает приведение: гораздо проще привести все к единому типу и иметь дело с матрицей с элементами одного типа.
Тем не менее, это выбор, созданный as.matrix
, и было бы возможно, хотя я считаю это нецелесообразным, преобразовать data.frame в матрицу-список, сохранив при этом все типы данных.
Это было бы неэффективно: векторы могут храниться в смежных ячейках памяти, что означает: 1/ память не тратится впустую при хранении типов данных элементов и 2/ более быстрая обработка с векторизованным кодом 3/ внешний код C или Fortran ожидает непрерывные типы данных, и это было бы быть громоздким и бесполезным для работы со списками. Я никогда не видел, чтобы матрица-список действительно использовалась, хотя я думаю, что в некоторых случаях это может помочь.
Ответ на ваш второй вопрос находится в документации as.matrix
:
as.matrix is a generic function. The method for data frames will return a character matrix if there is only atomic columns and any non-(numeric/logical/complex) column, applying as.vector to factors and format to other non-character columns. Otherwise, the usual coercion hierarchy (logical < integer < double < complex) will be used, e.g., all-logical data frames will be coerced to a logical matrix, mixed logical-integer will give a integer matrix, etc.
Вы также можете взглянуть на исходный код as.matrix.data.frame
.
@v_Apery Хороший способ узнать о них — протестировать для данного объекта x
результат нескольких функций: typeof(x)
, mode(x)
, class(x)
, is.vector(x)
, is.atomic(x)
, attributes(x)
, unclass(x)
, str(x)
. Я дам вам взглянуть на документацию об этих функциях. Также обратите внимание, что для данного type
часто существует функция is.type
(например, is.integer
, is.numeric
, is.character
...), которая возвращает true, если объект, переданный в качестве аргумента, имеет этот тип.
Круто, большое спасибо за ваш очень читаемый ответ, Жан-Клод !! Вы, вероятно, можете сказать, что я довольно новичок в программировании, и мне пока труднее всего понять концепцию типов данных.