2013-08-06 5 views
2

Очень простой вопрос, который я хочу задать в общем виде, потому что это кажется повторяющейся проблемой, и я был бы рад найти общий способ сделать это. Проблема состоит в том, чтобы преобразовать матрицу логических элементов, например, в матрицу факторов, например, но сохраняя структуру матрицы: количество строк & столбцов, столбцов, имен ростов. Я хотел бы что-то более простое, чемПреобразование матрицы из режима A в режим B

X2 <- matrix(as.mode(X), ncol=ncol(X)); 
rownames(X2) <- rownames(X) ... 

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

А. в (->) факторы - это тот, с которым у меня нет простого способа сделать.

B. 1. - логические выражения> Числовой: использует '+0' трюк

BoolMatrix <- matrix(c(TRUE,FALSE),nrow=3,ncol=2) 
rownames(BoolMatrix) <- LETTERS[1:3]; colnames(BoolMatrix) <-LETTERS[11:12] 
(NumMatrix <- BoolMatrix + 0) 

B. 2. числовую -> логична: используется непосредственно условие

NumMatrix <- matrix(1:6, ncol=2) 
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12] 
(BoolMatrix <- NumMatrix == 0) 

C . numeric < -> символ: не может работать лучше, чем 2 лайнера, напрямую меняя режим работы (а также будет работать между логическими и численными, но более сложные решения более элегантны)

CharMatrix <- NumMatrix 
mode(CharMatrix) <-"character" 
print(CharMatrix) 

последнее решение («2 лайнер») работает фактически для всего, что не связано с факторами, для которых я испытываю трудности ...

Идея? :-)

+0

Я думаю, что 'BoolMatrix' должно быть нечто большее, как:' BoolMatrix <- матрица (c (TRUE, FALSE), nrow = 3, ncol = 2) 'no? – thelatemail

+0

нет 'mode' =' factor' – mnel

+1

@mnel - я собирался ввести одно и то же, но тогда 'm' в ответе @HongOoi возвращает' TRUE' для 'is.factor' и' is. matrix'. – thelatemail

ответ

5

Использование structure, который привязывается список атрибутов для произвольного объекта. Для матрицы требуются следующие атрибуты: dim и, факультативно, dimnames.

Например преобразование X к матрице факторов:

m <- structure(factor(X), dim=dim(X), dimnames=dimnames(X)) 
+0

Прямо сейчас, просто отлично. Спасибо! –

+0

Приносит мне еще один вопрос: как, черт возьми, кто-то может научиться R без SO (и других пользовательских интернет-ресурсов)? Нет пути, который привел бы меня к структуре страницы в doc ... –

+0

За исключением тех, что НЕ являются факторами.Это становится матрицей символов. –

2

Опираясь на @ HongOoi отличными ответ, вот функция, которая сохранит все attributes входной матрицы (вкл. Размеры и имена измерений) и изменять данные в желаемом mode или к numericmode, factorclass ,

change.mat <- function(X,ch.fun) { 
    do.call(structure,c(list(.Data=do.call(ch.fun,list(X))),attributes(X))) 
} 

Примеры:

change.mat(NumMatrix,factor) 
# K L 
#A 1 4 
#B 2 5 
#C 3 6 
#Levels: 1 2 3 4 5 6 

change.mat(NumMatrix,as.character) 
# K L 
#A "1" "4" 
#B "2" "5" 
#C "3" "6" 

change.mat(BoolMatrix,as.numeric) 
# K L 
#A 1 0 
#B 0 1 
#C 1 0 
+0

Спасибо, очень приятное дополнение! –

1

Вы можете просто скопировать атрибуты:

NumMatrix <- matrix(1:6, ncol=2) 
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12] 

FacMatrix <- as.factor(NumMatrix) 
attributes(FacMatrix) <- c(attributes(FacMatrix), attributes(NumMatrix)) 
print(FacMatrix) 
# K L 
# A 1 4 
# B 2 5 
# C 3 6 
# Levels: 1 2 3 4 5 6 
+0

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

+1

Ну, вы можете определить методы матрицы для 'as. *', Если вы хотите сохранить строки кода. – Roland

 Смежные вопросы

  • Нет связанных вопросов^_^