Имена строк и столбцов в R - PullRequest
49 голосов
/ 17 февраля 2010

Следующие пары функций дают одинаковые результаты?

Пара 1) names() & colnames()

Пара 2) rownames() & row.names()

Ответы [ 4 ]

70 голосов
/ 17 февраля 2010

Как сказал Оскар Уайльд

Последовательность - последнее прибежище прозаический.

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> 
8 голосов
/ 17 февраля 2010

Просто немного расширим пример Дирка:

Помогает представить фрейм данных как список с векторами равной длины. Вероятно, поэтому 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
5 голосов
/ 17 февраля 2010

Я думаю, что использование colnames и rownames имеет смысл; вот почему.

Использование names имеет ряд недостатков. Вы должны помнить, что это означает «имена столбцов» и работает только с фреймом данных, поэтому вам нужно будет вызывать colnames всякий раз, когда вы используете матрицы. При вызове colnames вам нужно запомнить только одну функцию. Наконец, если вы посмотрите на код для colnames, вы увидите, что он в любом случае вызывает names в случае фрейма данных, поэтому вывод идентичен.

rownames и row.names возвращают одинаковые значения для фрейма данных и матриц; единственное различие, которое я заметил, состоит в том, что там, где нет никаких имен, rownames напечатает «NULL» (как и colnames), но row.names возвращает его невидимо. Так как между этими двумя функциями нет большого выбора, rownames выигрывает по эстетическим соображениям, поскольку он более симпатично сочетается с colnames. (Также для ленивого программиста вы сохраняете символ ввода.)

2 голосов
/ 17 февраля 2010

И еще одно расширение:

# 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

Если вы, однако, выполните предыдущую команду на matrix, вы все испортите:

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().

Так вот ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...