Строки имена и имена столбцов в R

следующие пары функций генерируют точно такие же результаты?

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

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

4 ответов


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

последовательность-последнее прибежище лишенный воображения.

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 и rownames имеет смысл; вот почему.

используя names имеет ряд недостатков. Вы должны помнить, что это означает "имена столбцов", и он работает только с фреймом данных, поэтому вам нужно позвонить colnames при использовании матриц. Позвонив 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

если вы, однако запустить предыдущую команду 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().

так и есть...