2014-12-23 3 views
5

Прошу прощения, если есть ответ, который уже есть для этого ... Я смотрел, но не мог найти его.Преобразование коэффициентов в номера

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

Позвольте мне объяснить. Вот пример набора данных:

demodata2 <- matrix(c("A","B","B","C",NA,"A","B","B",NA,"C","A","B",NA,"B",NA,"C","A","B",NA,NA,NA,"B","C","A","B","B",NA,"B","B",NA,"B","B",NA,"C","A",NA), nrow=6, ncol=6) 
democolnames <- c("Q","R","S","T","U","W") 
colnames(demodata2) <- democolnames 

Уступая:

 Q R S T U W 
[1,] "A" "B" NA NA "B" "B" 
[2,] "B" "B" "B" NA "B" "B" 
[3,] "B" NA NA NA NA NA 
[4,] "C" "C" "C" "B" "B" "C" 
[5,] NA "A" "A" "C" "B" "A" 
[6,] "A" "B" "B" "A" NA NA 

Ok. Так что я хочу это:

 Q R S T U W 
1 1 2 <NA> <NA> 1 2 
2 2 2 2 <NA> 1 2 
3 2 <NA> <NA> <NA> <NA> <NA> 
4 3 3 3 2 1 3 
5 <NA> 1 1 3 1 1 
6 1 2 2 1 <NA> <NA> 

Нет проблем. Давайте попробуем as.numeric(demodata2)

> as.numeric(demodata2) 
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[30] NA NA NA NA NA NA NA 
Warning message: 
NAs introduced by coercion 

Меньше чем удовлетворение. Давайте попробуем только один столбец ...

> as.numeric(demodata2[,3]) 
[1] NA NA NA NA NA NA 
Warning message: 
NAs introduced by coercion 

* редактировать *

Это на самом деле должны быть факторами, а не символы (спасибо @Carl Witthoft и @smci) ... так что давайте сделаем это в кадр данных ...

> demodata2 <- as.data.frame(demodata2) 
> as.numeric(demodata2) 
Error: (list) object cannot be coerced to type 'double' 

Nope. Но ждать ... вот где это становится интересным ...

> as.numeric(demodata2$S) 
[1] NA 2 NA 3 1 2 

Ну, это правильно. Давайте проверим, что я могу сделать это, позвонив по номерам:

> as.numeric(demodata2[,3]) 
[1] NA 2 NA 3 1 2 

Ok. Поэтому я могу сделать эту колонку по столбцу, собирающему мою новую матрицу, путем повторения через ncol раз ... но есть ли лучший способ?

И почему это барф, когда оно находится в матричной форме, в отличие от кадра данных? < - edit Фактически, это сейчас довольно очевидно ... в матричной форме это символы, а не факторы. Виноват. Вопрос по-прежнему стоит в области данных, хотя ...

Спасибо! (и указывая на существующий ответ полностью)

+4

Вашего примера ** Не ** факторы. Будьте осторожны с вашей номенклатурой. –

+1

Ваш пример - это матрица строк, а не факторов. Строки не имеют уровней факторов и т. Д. – smci

+0

Приношу свои извинения. Этот вопрос начался с импортированного набора данных, где строки автоматически считаются факторами (если не указано иное). Ошибка произошла, когда я попытался создать ее для использования stackoverflow. – rucker

ответ

6

Кажется, что ваш столбец U должен быть 2, соответствующий «B», а не 1. Пожалуйста, уточните это.

Вы можете попробовать match()

matrix(match(demodata2, LETTERS), nrow(demodata2), dimnames=dimnames(demodata2)) 
#  Q R S T U W 
# [1,] 1 2 NA NA 2 2 
# [2,] 2 2 2 NA 2 2 
# [3,] 2 NA NA NA NA NA 
# [4,] 3 3 3 2 2 3 
# [5,] NA 1 1 3 2 1 
# [6,] 1 2 2 1 NA NA 

Вы также мог бы получить этот результат с

m <- match(demodata2, LETTERS) 
attributes(m) <- attributes(demodata2) 

А затем посмотреть на m


Обновления для пересмотренного набора данных:

Для ваших обновленных данных, попробуйте

demodata2[] <- lapply(demodata2, as.numeric) 
demodata2 
# Q R S T U W 
# 1 1 2 NA NA 1 2 
# 2 2 2 2 NA 1 2 
# 3 2 NA NA NA NA NA 
# 4 3 3 3 2 1 3 
# 5 NA 1 1 3 1 1 
# 6 1 2 2 1 NA NA 

Теперь у вас есть 1-й в U колонки, потому что каждый столбец раскладывается по отдельности и, следовательно, B является первым (и только) значением в этом столбце.

+0

Замечательный ответ на вопрос, который я задал ... но, видимо, я задал неправильный вопрос. Сначала сделайте demodata2 в кадр данных (который автоматически помещает поля символов в факторы), а затем вы задаете вопрос, который я * задал *. Большое вам спасибо, и я надеюсь, что вы сможете помочь в этой дополнительной проблеме. – rucker

+1

@rucker - это еще проще для ваших обновленных данных. Do 'demodata2 [] <- lapply (demodata2, as.numeric)' Теперь у вас есть 1 в столбце 'U', потому что каждый столбец разделяется по отдельности и, следовательно, B является первым (и единственным) значением –

+0

Большое вам спасибо! Просто? Может быть. Но я общался с этим, поэтому ваша помощь очень ценится. – rucker

3

Или с помощью dim<-

`dim<-`(as.numeric(factor(demodata2)), c(nrow(demodata2), ncol(demodata2))) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 2 NA NA 2 2 
# [2,] 2 2 2 NA 2 2 
# [3,] 2 NA NA NA NA NA 
# [4,] 3 3 3 2 2 3 
# [5,] NA 1 1 3 2 1 
# [6,] 1 2 2 1 NA NA 

Если вам нужны имена столбцов, you''ll должны сделать это в два этапа, как в

Res <- `dim<-`(as.numeric(factor(demodata2)), c(nrow(demodata2), ncol(demodata2))) 
colnames(Res) <- colnames(demodata2) 
+0

Другой способ переписать вашу строку: 'matrix (as.numeric (factor (demodata2)), ncol = ncol (demodata2))' – nicola

+0

@David Arenburg : Замечательный ответ на вопрос, который я задал ... но, видимо, я задал неправильный вопрос. Сначала сделайте demodata2 в кадр данных (который автоматически помещает поля символов в факторы), а затем вы задаете вопрос, который я * задал *. Большое вам спасибо, и я надеюсь, что вы сможете помочь в этой дополнительной проблеме. – rucker

4

Механически, это очень похоже на 'dim<-' ответ. Чуть более прозрачный, но, вероятно, менее эффективный (может быть?).

matrix(as.numeric(factor(demodata2)), ncol = ncol(demodata2)) 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 2 NA NA 2 2 
[2,] 2 2 2 NA 2 2 
[3,] 2 NA NA NA NA NA 
[4,] 3 3 3 2 2 3 
[5,] NA 1 1 3 2 1 
[6,] 1 2 2 1 NA NA 
+0

Отсутствует скобка ... –

+0

Упс, спасибо. Выключает 'as.vector()' также не нужно. – Gregor

+0

Я предполагаю, что это было бы более эффективно, чем '<-dim' просто потому, что пропуская часть« nrow », я просто хотел быть немного с ней :) –

2
apply(demodata2, 2, function(x) 
      as.numeric(factor(x ,levels=unique(as.vector(demodata2))))) 
#--------------- 
     Q R S T U W 
[1,] 1 2 NA NA 2 2 
[2,] 2 2 2 NA 2 2 
[3,] 2 NA NA NA NA NA 
[4,] 3 3 3 2 2 3 
[5,] NA 1 1 3 2 1 
[6,] 1 2 2 1 NA NA 

(я обнаружил с помощью получения неправильного ответа, что unique на матрице не возвращает то, что я ожидал.)

+0

Замечательный ответ на вопрос, который я задал ... но, видимо, я задал неправильный вопрос. Сначала сделайте demodata2 в кадр данных (который автоматически помещает поля символов в факторы), а затем вы задаете вопрос, который я * задал *. Большое вам спасибо, и я надеюсь, что вы сможете помочь в этой дополнительной проблеме. – rucker

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