Как преобразовать определенные столбцы фрейма данных в факторы?

Возможный дубликат:
определение или кодирование уникальных факторов используя R

У меня проблемы с Р.

У меня есть набор данных, аналогичный следующему, но намного длиннее.

A B Pulse
1 2 23
2 2 24
2 2 12
2 3 25
1 1 65
1 3 45

В основном кодируются первые 2 столбца. A имеет 1, 2, которые представляют 2 разных веса. B имеет 1, 2, 3, которые представляют 3 разных времени.

Поскольку они являются закодированными числовыми значениями, R будет рассматривать их как числовые переменные. Мне нужно использовать функцию фактора, чтобы преобразовать эти переменные в факторы.

Помощь?


person math11    schedule 28.11.2012    source источник


Ответы (2)


Вот пример:

#Create a data frame
> d<- data.frame(a=1:3, b=2:4)
> d
  a b
1 1 2
2 2 3
3 3 4

#currently, there are no levels in the `a` column, since it's numeric as you point out.
> levels(d$a)
NULL

#Convert that column to a factor
> d$a <- factor(d$a)
> d
  a b
1 1 2
2 2 3
3 3 4

#Now it has levels.
> levels(d$a)
[1] "1" "2" "3"

Вы также можете справиться с этим при чтении ваших данных. См. параметры colClasses и stringsAsFactors, например. readCSV().

Обратите внимание, что с вычислительной точки зрения факторизация таких столбцов не сильно вам поможет и может фактически замедлить вашу программу (хотя и незначительно). Использование фактора потребует, чтобы все значения были сопоставлены с идентификаторами за кулисами, поэтому любая печать вашего data.frame требует поиска на этих уровнях - дополнительный шаг, который требует времени.

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

person Jeff Allen    schedule 28.11.2012
comment
Но каждое из чисел что-то обозначает. Для A 1 представляет длинную, а 2 — короткую. Для B 1 2 3 представляет 1 кг, 2 кг, 3 кг. Поэтому мне нужно преобразовать все эти 1, 2 и т. д. в 1 кг, 2 кг, длинные, короткие и т. д. Мне нужно добавить к ним метки. - person math11; 29.11.2012
comment
Попробуйте запустить приведенный выше код, а затем присвоить значение levels чему-то более полезному. Например, levels(d$a) <- c("Long", "Short"). Теперь вам (или новому пользователю, просматривающему ваш код) не нужно беспокоиться о запоминании сопоставлений между вашими идентификаторами и вашими метками. R выполнит сопоставление для вас и просто представит вам метки. - person Jeff Allen; 29.11.2012
comment
Jeff — более полное решение, потому что добавляет уровни в ту же команду. - person Juano; 07.03.2021

Учитывая следующий образец

myData <- data.frame(A=rep(1:2, 3), B=rep(1:3, 2), Pulse=20:25)  

тогда

myData$A <-as.factor(myData$A)
myData$B <-as.factor(myData$B)

или вы можете полностью выбрать свои столбцы и красиво их обернуть:

# select columns
cols <- c("A", "B")
myData[,cols] <- data.frame(apply(myData[cols], 2, as.factor))

levels(myData$A) <- c("long", "short")
levels(myData$B) <- c("1kg", "2kg", "3kg")

Чтобы получить

> myData
      A   B Pulse
1  long 1kg    20
2 short 2kg    21
3  long 3kg    22
4 short 1kg    23
5  long 2kg    24
6 short 3kg    25
person Ricardo Saporta    schedule 28.11.2012