Когда следует использовать data.frame
, и когда лучше использовать matrix
?
Оба сохраняют данные в прямоугольном формате, поэтому иногда это неясно.
Существуют ли какие-либо общие правила для использования какого типа данных?
Когда следует использовать data.frame
, и когда лучше использовать matrix
?
Оба сохраняют данные в прямоугольном формате, поэтому иногда это неясно.
Существуют ли какие-либо общие правила для использования какого типа данных?
Часть ответа содержится уже в вашем вопросе: вы используете кадры данных, если можно считать, что столбцы (переменные) могут быть разных типов (числовые/символьные/логические и т.д.). Матрицы предназначены для данных того же типа.
Следовательно, матрица выбора /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 лучше для представления (печати) табличной информации, так как вы можете применять форматирование для каждого столбца отдельно.
Что-то, не упомянутое в @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
Я почти всегда использую фрейм данных для своих задач анализа данных, поскольку у меня часто бывает больше, чем просто числовых переменных. Когда я программирую функции для пакетов, я почти всегда принуждаю к матрице, а затем отформатирую результаты в качестве фрейма данных. Это связано с тем, что кадры данных удобны.
@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
Матрица на самом деле является вектором с дополнительными методами. а data.frame - это список. Разница сводится к вектору vs list. для эффективности вычислений, придерживаться матрицы. Использование data.frame, если вам нужно.
Матрицы и фреймы данных представляют собой прямоугольные 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