Должен ли я использовать data.frame или матрицу?

Когда следует использовать data.frame, и когда лучше использовать matrix?

Оба сохраняют данные в прямоугольном формате, поэтому иногда это неясно.

Существуют ли какие-либо общие правила для использования какого типа данных?

Ответ 1

Часть ответа содержится уже в вашем вопросе: вы используете кадры данных, если можно считать, что столбцы (переменные) могут быть разных типов (числовые/символьные/логические и т.д.). Матрицы предназначены для данных того же типа.

Следовательно, матрица выбора /data.frame является только проблематичной, если у вас есть данные того же типа.

Ответ зависит от того, что вы собираетесь делать с данными в data.frame/matrix. Если он будет передан другим функциям, то ожидаемый тип аргументов этих функций определит выбор.

также:

Матрицы более эффективны с точки зрения памяти:

m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes

Матрицы являются необходимостью, если вы планируете выполнять операции типа линейной алгебры.

Кадры данных более удобны, если вы часто ссылаетесь на свои столбцы по имени (через оператор compact $).

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

Ответ 2

Что-то, не упомянутое в @Michal, заключается в том, что не только матрица, меньшая, чем эквивалентный кадр данных, использование матриц может сделать ваш код намного более эффективным, чем использование фреймов данных, что часто значительно. Это одна из причин, по которой внутри, многие функции R будут принуждать к матрицам данных, которые находятся в кадрах данных.

Кадры данных часто намного удобнее; не всегда есть только атомные куски данных, лежащих вокруг.

Обратите внимание, что вы можете иметь матрицу символов; вам просто не нужно иметь числовые данные для построения матрицы в R.

При преобразовании фрейма данных в матрицу обратите внимание, что существует функция data.matrix(), которая соответствующим образом обрабатывает факторы путем преобразования их в числовые значения на основе внутренних уровней. Принуждение через as.matrix() приведет к матрице символов, если какая-либо из меток-меток не является числовой. Для сравнения:

> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a   B  
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6

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

Ответ 3

@Michal: Матрицы на самом деле не имеют большей памяти:

m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes

... если у вас нет большого количества столбцов:

m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes

Ответ 4

Матрица на самом деле является вектором с дополнительными методами. а data.frame - это список. Разница сводится к вектору vs list. для эффективности вычислений, придерживаться матрицы. Использование data.frame, если вам нужно.

Ответ 5

Матрицы и фреймы данных представляют собой прямоугольные 2D-массивы и могут быть неоднородно по строкам и столбцам. Они разделяют некоторые методы и свойства, но не все.

Примеры:

M <- list(3.14,TRUE,5L,c(2,3,5),"dog",1i)  # a list
dim(M) <- c(2,3)                           # set dimensions
print(M)                                   # print result

#      [,1]  [,2]      [,3]
# [1,] 3.14  5         "dog"
# [2,] TRUE  Numeric,3 0+1i

DF <- data.frame(M)                   # a data frame
print(DF)                             # print result

#      X1      X2   X3
#  1 3.14       5  dog
#  2 TRUE 2, 3, 5 0+1i

M <- matrix(c(1,1,1,1,2,3,1,3,6),3)   # a numeric matrix
DF <- data.frame(M)                   # a all numeric data frame

solve(M)                              # obtains inverse matrix
solve(DF)                             # obtains inverse matrix
det(M)                                # obtains determinant
det(DF)                               # error