Строки имена и имена столбцов в 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()
.
так и есть...