Возврат к кодам фактора R - PullRequest
0 голосов
/ 31 января 2011

Допустим, у меня есть data.frame, который выглядит следующим образом:

df.test <- data.frame(1:26, 1:26)
colnames(df.test) <- c("a","b")

, и я применяю коэффициент:

df.test$a <- factor(df.test$a, levels=c(1:26), labels=letters)

Теперь, как бы я хотел преобразовать его обратноцелые коды:

as.numeric(df.test[1])## replies with an error code.

Но это работает:

as.numeric(df.test$a)

Почему это так?

Ответы [ 4 ]

3 голосов
/ 31 января 2011

На самом деле ссылка Джошуа здесь не применима, потому что задача не охватывает фактор с уровнями, которые имеют числовую интерпретацию. Ваше первоначальное усилие, которое привело к ошибке, было почти правильным. До 1:

отсутствовала только запятая
df.test <- data.frame(1:26, 1:26)
colnames(df.test) <- c("a","b")
df.test$a <- factor(df.test$a, levels=c(1:26), labels=letters)
as.numeric(df.test[,1])
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
# [19] 19 20 21 22 23 24 25 26

Или вы могли бы использовать "[["

> as.numeric(df.test[[1]])
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26
2 голосов
/ 31 января 2011

as.numeric преобразует коэффициент в числовой:

as.numeric(df.test$a)
1 голос
/ 31 января 2011

Доступ к столбцу по имени дает вам фактор-вектор, который можно преобразовать в числовой.Однако фрейм данных представляет собой список (из столбцов), и когда вы используете один оператор скобок и одно число в списке, вы получаете список длины один.То же самое относится и к фреймам данных, поэтому df.test[1] возвращает первый столбец как новый фрейм данных, который не может быть принудительно вызван as.numeric().Я этого не знал!

> str(df.test$a)
 Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
> str(df.test[1])
'data.frame':   26 obs. of  1 variable:
 $ a: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
1 голос
/ 31 января 2011

Чтобы ответить на ваши изменения: имейте в виду, что фактор состоит из двух частей: 1) меток и 2) основных целочисленных кодов. Два ответа, на которые я ссылался в своем комментарии, заключались в преобразовании меток в числовые. Если вы просто хотите получить внутренние коды, используйте as.integer(df.test$a), как показано в разделе примеров ?factor. aL3xa ответил на ваш вопрос о том, почему as.numeric(df.test[1]) выдает ошибку.

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