Названия строки и имена столбцов в R

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

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

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

50
задан Mehper C. Palavuzlar 29 September 2010 в 20:00
поделиться

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> 
73
ответ дан 7 November 2019 в 10:56
поделиться

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

Это помогает думать о фрейме данных как о списке с векторами одинаковой длины. Возможно, поэтому 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
8
ответ дан 7 November 2019 в 10:56
поделиться

Я думаю, что использование имен столбцов и имен строк имеет наибольший смысл; вот почему.

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

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

5
ответ дан 7 November 2019 в 10:56
поделиться

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

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

Итак ...

2
ответ дан 7 November 2019 в 10:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: