кодирование значений переменных в классы с использованием R - PullRequest
8 голосов
/ 17 мая 2011

У меня есть набор данных, в котором мне нужно кодировать значения определенных переменных (числовые) в 3 класса.

Мой набор данных похож на этот, но имеет еще 60 переменных:

anim <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
wt <- c(181,179,180.5,201,201.5,245,246.4,189.3,301,354,369,205,199,394,231.3)
data <- data.frame(anim,wt)

> data
   anim    wt
1     1 181.0
2     2 179.0
3     3 180.5
4     4 201.0
5     5 201.5
6     6 245.0
7     7 246.4
8     8 189.3
9     9 301.0
10   10 354.0
11   11 369.0
12   12 205.0
13   13 199.0
14   14 394.0
15   15 231.3

Мне нужно закодировать значения переменной "wt" в 3 класса: (wt> = 179 & wt <200) = 1; (вес> = 200 и вес <300) = 2; (вес> 300) = 3

, который должен дать мне это

> data2
   anim    wt SWT
1     1 181.0   1
2     2 179.0   1
3     3 180.5   1
4     4 201.0   2
5     5 201.5   2
6     6 245.0   2
7     7 246.4   2
8     8 189.3   1
9     9 301.0   3
10   10 354.0   3
11   11 369.0   3
12   12 205.0   2
13   13 199.0   1
14   14 394.0   3
15   15 231.3   2

Ответы [ 5 ]

10 голосов
/ 17 мая 2011

Метод cut, описанный @Greg, вероятно, вам нужен здесь.Следует отметить, что cut возвращает коэффициент по умолчанию, который можно подавить, указав labels = FALSE для возврата целочисленных значений:

cut(data$wt, c(178, 200, 300, Inf), labels = FALSE)

В качестве альтернативы, если обрезка не поддается естественномуперерывы, вы можете использовать ifelse().Вы можете «вкладывать» операторы ifelse, аналогичные Excel.Я использую «с», чтобы сократить необходимое набрав:

data$group2 <- with(data, ifelse(wt >= 179 & wt < 200, 1, 
  ifelse(wt >= 200 & wt < 300, 2, 3))
)
5 голосов
/ 17 мая 2011

Вы можете попробовать cut

anim <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) 
wt <-c(181,179,180.5,201,201.5,245,246.4,
189.3,301,354,369,205,199,394,231.3) 
data <- data.frame(anim,wt)

РЕДАКТИРОВАТЬ: фиксированная группа - право = ЛОЖЬ, избавился от примера разделения.

group = cut(data$wt, c(178, 200, 300, Inf), right=FALSE)


data$swt = as.numeric(group)
data
   anim    wt swt
1     1 181.0   1
2     2 179.0   1
3     3 180.5   1
4     4 201.0   2
5     5 201.5   2
6     6 245.0   2
7     7 246.4   2
8     8 189.3   1
9     9 301.0   3
10   10 354.0   3
11   11 369.0   3
12   12 205.0   2
13   13 199.0   1
14   14 394.0   3
15   15 231.3   2
> 
2 голосов
/ 17 мая 2011

Я думаю, что ответы Грега охватывают «стандартную рабочую процедуру», но я также нахожу множество применений для функции findInterval. Естественно, он возвращает число, идентифицирующее интервал во втором аргументе.

 data$int <- findInterval(data$wt, c(179, 200, 300, Inf))
 data
1 голос
/ 17 мая 2011

Просто чтобы показать альтернативный (аналогично перекодированию в SPSS) метод из пакета car :

> data$SWT <- with(data, recode(wt, "lo:200=1; 300:hi=3; else=2"))
> data
   anim    wt SWT
1     1 181.0   1
2     2 179.0   1
3     3 180.5   1
4     4 201.0   2
5     5 201.5   2
6     6 245.0   2
7     7 246.4   2
8     8 189.3   1
9     9 301.0   3
10   10 354.0   3
11   11 369.0   3
12   12 205.0   2
13   13 199.0   1
14   14 394.0   3
15   15 231.3   2
0 голосов
/ 17 мая 2011

Просто для полноты и информации пакет classInt (в CRAN) - еще один удобный способ классификации чисел по классам.

...