从R中的整数列创建分类值列

时间:2018-03-06 08:42:51

标签: r range

我是R的新手,但我找不到一个简单的解决方案。例如,我有以下数据框:

case <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
areas <- c(1,2,1,1,1,2,2,2,2,1,1,2,2,2,1,1,1,2,2,2)
A <- c(1,2,11,12,20,21,26,43,43,47,48,59,63,64,65,66,67,83,90,91)
var <- c(1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0)
outcome <- c(1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0)

df <- data.frame(case,areas,A,var,outcome)

   case areas  A var outcome
1     1     1  1   1       1
2     2     2  2   1       0
3     3     1 11   0       0
4     4     1 12   0       0
5     5     1 20   0       0
6     6     2 21   1       0
7     7     2 26   1       0
8     8     2 43   0       0
9     9     2 43   0       0
10   10     1 47   1       1
11   11     1 48   0       0
12   12     2 59   1       1
13   13     2 63   0       0
14   14     2 64   1       0
15   15     1 65   1       0
16   16     1 66   0       0
17   17     1 67   0       0
18   18     2 83   0       1
19   19     2 90   0       0
20   20     2 91   0       0

在'A'列中我们有很多整数,我想创建一个额外的列,按照其成员资格将每个案例分组到以下类别:

小于5; 5 - 19; 20 - 49; 50-79; 80 +

因此列的前3行应该是一个字符串值,表示“&lt; 5”,“&lt; 5”,“5 - 19”......依此类推,列中的最后一个值将是是“80 +”。

我可以写出这样的东西,但看起来很草率:

A_groups = ifelse(df$A<5, "<5", df$A)
A_groups = ifelse(df$A>4 & df$A<20, "5-19", A_groups)
A_groups = ifelse(df$A>19 & df$A<50, "20-49", A_groups)

最好的选择是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用cut()findInterval()

breaks = c(0,5,20,50,80,Inf)
labels = c("<5", "5-19", "20-49", "50-79", "80+")

# Using cut()
df$A_groups = cut(df$A, breaks = breaks, right = FALSE, labels = labels)

# Using findInterval()
df$B_groups = factor(findInterval(df$A, breaks), labels = labels)

答案 1 :(得分:1)

您正在寻找cut()功能。您希望基于间隔创建一个因子,这是此函数提供的。

df$new_factor <- cut(df$A, breaks = c(-Inf, 5, 20, 50, 80, Inf),
                 labels = c('<5', '5-19', '20-49', '50-79', '80+'),
                 right = FALSE)

查看helppage:?cut,了解我加入right = FALSE的原因。要仔细检查它是否适用于您所做的事情,创建一些您无法确定的案例总是很好的。例如:选中case == 5 right = FALSE是否有new_factor,看看Contains会发生什么。