(R) Вопрос о приведении типов при преобразовании фрейма данных в матрицу в R

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

У меня есть фрейм данных, который содержит числовые, факторные и упорядоченные факторные переменные, и когда я преобразовал его в матрицу, используя as.matrix, я заметил, что все элементы матрицы были символами. Из этого опыта у меня есть 2 вопроса;

Во-первых, прав ли я, говоря, что векторы и матрицы могут содержать только один тип данных, и поэтому происходит приведение?

Во-вторых, и что более важно, какие комбинации типов данных во фрейме данных приводят к символьным матрицам по сравнению с числовыми матрицами и т. д.? например Если бы в моем df были только логические, целочисленные и числовые типы, я думаю, что получил бы числовую матрицу, это правильно? Так это просто включение факторов, упорядоченных факторов и/или символов в мой фрейм данных, который при преобразовании в матрицу приводит к принуждению каждого элемента к символу?

Большое спасибо за чтение, любая помощь приветствуется :]

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ на первый вопрос: да и нет.

На самом деле матрица — это вектор с атрибутом 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 16.03.2022 15:11

@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, если объект, переданный в качестве аргумента, имеет этот тип.

Jean-Claude Arbaut 16.03.2022 16:23

Другие вопросы по теме