Следующее функционирует, пары генерируют точно те же результаты?
Пара 1) names()
& colnames()
Пара 2) rownames()
& row.names()
Как сказал Оскар Уайльд
Согласованность - это последнее прибежище лишенного воображения.
R - это скорее развитый, чем разработанный язык, поэтому такие вещи случаются. names ()
и colnames ()
работают с data.frame
, но names ()
не работают с матрицей:
R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3])
R> names(DF)
[1] "foo" "bar"
R> colnames(DF)
[1] "foo" "bar"
R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma")))
R> names(M)
NULL
R> colnames(M)
[1] "alpha" "beta" "gamma"
R>
Просто немного расширим пример Дирка:
Это помогает думать о фрейме данных как о списке с векторами одинаковой длины. Возможно, поэтому names
работает с фреймом данных, но не с матрицей.
Другая полезная функция - dimnames
, которая возвращает имена для каждого измерения. Вы заметите, что функция rownames
на самом деле просто возвращает первый элемент из dimnames
.
Что касается rownames
и row.names
: Я не вижу разницы, хотя rownames
использует dimnames
, а row.names
был написан вне R. Они оба, похоже, работают с массивами более высокой размерности:
>a <- array(1:5, 1:4)
> a[1,,,]
> rownames(a) <- "a"
> row.names(a)
[1] "a"
> a
, , 1, 1
[,1] [,2]
a 1 2
> dimnames(a)
[[1]]
[1] "a"
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
Я думаю, что использование имен столбцов
и имен строк
имеет наибольший смысл; вот почему.
Использование имен
имеет ряд недостатков. Вы должны помнить, что это означает «имена столбцов», и он работает только с фреймом данных, поэтому вам нужно будет вызывать colnames
всякий раз, когда вы используете матрицы. Вызывая имена столбцов
, вам нужно запомнить только одну функцию. Наконец, если вы посмотрите на код для colnames
, вы увидите, что он в любом случае вызывает names
в случае фрейма данных, поэтому вывод идентичен.
rownames
и row.names
возвращают одинаковые значения для кадра данных и матриц; единственное различие, которое я заметил, состоит в том, что там, где нет никаких имен, rownames
будет выводить «NULL» (как и colnames
), но row.names
] возвращает его невидимо. Поскольку выбирать между двумя функциями не так уж и много, rownames
выигрывает с точки зрения эстетики, поскольку он лучше сочетается с colnames
. (Кроме того, для ленивого программиста вы сохраняете символ набора текста.)
И еще одно расширение:
# create dummy matrix
set.seed(10)
m <- matrix(round(runif(25, 1, 5)), 5)
d <- as.data.frame(m)
Если вы хотите назначить новые имена столбцов, вы можете сделать следующее в data.frame
:
# an identical effect can be achieved with colnames()
names(d) <- LETTERS[1:5]
> d
A B C D E
1 3 2 4 3 4
2 2 2 3 1 3
3 3 2 1 2 4
4 4 3 3 3 2
5 1 3 2 4 3
Однако, если вы запустите предыдущую команду на матрице
, вы запутаетесь:
names(m) <- LETTERS[1:5]
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 3 2 4 3 4
[2,] 2 2 3 1 3
[3,] 3 2 1 2 4
[4,] 4 3 3 3 2
[5,] 1 3 2 4 3
attr(,"names")
[1] "A" "B" "C" "D" "E" NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[20] NA NA NA NA NA NA
Поскольку матрицу можно рассматривать как двумерный вектор, вы будете присваивать имена только первым пяти значениям (вы же не хотите этого делать, не так ли?). В этом случае вам следует придерживаться colnames ()
.
Итак ...