Использование функции nchar для факторных переменных - PullRequest
2 голосов
/ 17 февраля 2012

Может кто-нибудь объяснить мне, что здесь происходит?когда переменная закодирована как фактор и nchar приводит к символу, почему эта функция не может эффективно подсчитать количество символов?

> x <- c("73210", "73458", "73215", "72350")
> nchar(x)
[1] 5 5 5 5
> 
> x <- factor(x)
> nchar(x)
[1] 1 1 1 1
> 
> nchar(as.character(x))
[1] 5 5 5 5

спасибо.

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

Это потому, что с коэффициентом ваши данные представлены 1, 2 и т. Д. То, что вы хотите сделать, это считать символы уровней:

> nchar(levels(x)[x])
[1] 5 5 5 5
2 голосов
/ 17 февраля 2012

Другие ответы верны, я думаю, проблема в том, что nchar исследует базовые целочисленные коды, а не метки. Тем не менее, я думаю, что наиболее прямо затрагивает ваш вопрос это кусок из ?nchar:

Внутренний эквивалент метода по умолчанию as.character: выполняется на х (поэтому метод отправки отсутствует)

Я не уверен на 100%, но я подозреваю, что это означает, что принуждение, которое имеет место в nchar, это , а не то же самое, что происходит, когда вы непосредственно вызываете as.character, скорее всего непосредственно к целочисленным кодам, а не «ловко» глядя на метки.

2 голосов
/ 17 февраля 2012

см. Раздел предупреждения ?factor:

The interpretation of a factor depends on both the codes and the
 ‘"levels"’ attribute.  Be careful only to compare factors with the
 same set of levels (in the same order).  In particular,
 ‘as.numeric’ applied to a factor is meaningless, and may happen by
 implicit coercion.  To transform a factor ‘f’ to approximately its
 original numeric values, ‘as.numeric(levels(f))[f]’ is recommended
 and slightly more efficient than ‘as.numeric(as.character(f))’.

nchar(levels(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...