使用R将变量值编码到类中

时间:2011-05-17 00:02:09

标签: r variables break subclass

我有一组数据,我需要将某些变量(数字)的值编码为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&amp; wt&lt; 200)= 1; (wt> = 200&amp; wt&lt; 300)= 2; (wt> 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 个答案:

答案 0 :(得分:10)

@Greg概述的cut方法可能就是您想要的。需要注意的一点是cut默认返回一个因子,您可以通过提供labels = FALSE来返回整数值来抑制该因子:

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

或者,如果您的切割不适合自然休息,您可以使用ifelse()。您可以“嵌套”类似于Excel的ifelse语句。我使用“with”来减少所需的输入:

data$group2 <- with(data, ifelse(wt >= 179 & wt < 200, 1, 
  ifelse(wt >= 200 & wt < 300, 2, 3))
)

答案 1 :(得分:5)

您可以尝试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 :(得分:2)

我认为Greg的答案涵盖“标准操作程序”,但我发现findInterval函数也有很多用途。它自然会返回一个数字,用于标识第二个参数中的区间。

 data$int <- findInterval(data$wt, c(179, 200, 300, Inf))
 data

答案 3 :(得分:1)

仅显示包car中的替代方法(类似于SPSS中的重新编码):

> 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

答案 4 :(得分:0)

为了完整性和信息,classInt包(在CRAN上)是另一种将数字分类到类中的方便方法。