2011-03-01 3 views
129

Когда следует использовать data.frame, и когда лучше использовать matrix?Должен ли я использовать data.frame или матрицу?

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

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

+0

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

ответ

160

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

Следовательно, матрица выбора/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 

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

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

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

+2

Я бы добавил к этому вопросу следующее: если вы планируете использовать пакет ggplot2 для создания графиков, ggplot2 работает только с data.frames, а не с матрицами. Просто то, что нужно знать! – Bajcz

65

Что-то, о чем не упоминалось в @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 

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

+6

+1 хорошо знать о 'data.matrix' –

+0

Мне было интересно узнать разницу между data.matrix() и as.matrix(). Благодаря прояснению их и вашим советам в программировании. – microbe

+0

Спасибо за то, что поделились @ Gavin Simpson! Не могли бы вы представить немного больше о том, как вернуться с 1-6 на a-f? –

9

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

+3

Хмм, матрица - это вектор с размерами, я не вижу, где к нему приходят методы? –

43

@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 
+0

аргумент полезности памяти действительно о 'data.frames', предлагающем большую гибкость в отношении типов столбцов. 'data.frame (a = rnorm (1e6), b = sample (буквы, 1e6, TRUE))' будет намного меньше (6x по моим быстрым вычислениям) в памяти, чем версия 'matrix' из-за принуждения типа. – MichaelChirico

0

матрицы и кадры данных имеют прямоугольную форму 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 

 Смежные вопросы

  • Нет связанных вопросов^_^