сохранять имена столбцов при применении as.vector к матричному срезу

Допустим, у меня есть матрица,

A = matrix(c(1,23,4,5,6,3,2,2,1,2), nrow = 2, ncol = 5)

с именами строк и столбцов, заданными,

rownames(A) = c('row1', 'row2')
colnames(A) = c('es', 'one', 'column', 'no', '5')

If I do:

> my.slice = A[1,,drop=FALSE]
    es    one column     no      5 
     1      4      6      2      1 

Я все еще вижу названия столбцов. Но если я это сделаю:

> my.slice = as.numeric(A[1,,drop=FALSE])
[1] 1 4 6 2 1

Я потерял имена столбцов, и оба на самом деле относятся к числовому классу.

Есть ли способ сделать as.vector и сохранить имена столбцов? Или, в более общем смысле, разрезать матрицу на вектор числового класса с именами (my.slice) = colnames (A)?

ПРИМЕЧАНИЕ (небольшая история). Все началось, когда я установил значение по умолчанию drop = FALSE. Затем мне нужно сделать as.vector, когда я разрезаю матрицы, но, к сожалению, теперь я теряю имена элементов в my.slice.


person Dnaiel    schedule 22.07.2014    source источник
comment
is.vector(A[1,]) возвращает TRUE, в первую очередь потому, что [ имеет drop=TRUE установленный по умолчанию. Попробуйте dput(A[1,]), и вы увидите, что это просто вектор с некоторыми именами.   -  person thelatemail    schedule 22.07.2014
comment
@thelatemail спасибо. это хороший ответ, но я ищу короткий, который удержит меня в числовом классе, поскольку весь мой код встроен в операции этого класса.   -  person Dnaiel    schedule 22.07.2014
comment
Он числовой - is.numeric(A[1,]) == TRUE   -  person thelatemail    schedule 22.07.2014
comment
@thelatemail, это хорошо. некоторые дополнительные вопросы, могу ли я отключить режим печати? и это так же быстро, как вектор? Я использую as.vector в циклах for, поэтому печать структуры на экране делает ее неудобной. Помимо этого, похоже, хороший способ пойти.   -  person Dnaiel    schedule 22.07.2014
comment
Я тут запутался. Подмножество одной строки даст вам вектор с именами - as.vector не требуется.   -  person thelatemail    schedule 22.07.2014
comment
Тогда не делай этого. Отмена значений по умолчанию - это первоклассный способ улучшить ваш код.   -  person thelatemail    schedule 22.07.2014
comment
setNames (as.numeric (A [1,, drop = F]), colnames (A)) es one column no 5 1 4 6 2 1   -  person akrun    schedule 22.07.2014
comment
@Dnaiel: не меняйте значение по умолчанию, это потенциально нарушает работу всех пакетов, полагающихся на нормальное поведение. Не делай этого, братан. Особенно, если нам нужна только красивая печать. Оставьте поведение по умолчанию, вместо этого напишите функцию форматирования.   -  person smci    schedule 11.06.2015


Ответы (2)


Вы можете преобразовать матрицу во фрейм данных, разрезать его и использовать unlist, чтобы преобразовать срез в именованный вектор:

B <- as.data.frame(A)

my.slice <- unlist(B[1,])

Это работает до тех пор, пока имена столбцов не содержат странных символов: имена столбцов фрейма данных должны быть синтаксически приемлемыми как имена переменных, поэтому они не могут начинаться с цифр или знаков препинания.

person Adrian Baddeley    schedule 11.02.2016

Используя setNames:

(my.slice = setNames(A[1,], colnames(A)))
es    one column     no      5 
 1      4      6      2      1 

class(my.slice)
[1] "numeric"
person tflutre    schedule 17.01.2017