Что-то, о чем не упоминалось в @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
Я почти всегда использую фрейм данных для своих задач анализа данных, поскольку у меня часто бывает больше, чем просто числовых переменных. Когда я программирую функции для пакетов, я почти всегда принуждаю к матрице, а затем отформатирую результаты в качестве фрейма данных. Это связано с тем, что кадры данных удобны.
Часто матрица может быть лучше подходит для определенного типа данных, но если пакет, который вы хотите использовать для анализа указанной матрицы ожидает кадр данных, вы всегда должны без необходимости его преобразовать. Я думаю, что нет способа избежать повторения того, какой пакет использует. – xApple