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

问题描述 投票:0回答:2

我是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行应该是一个字符串值,表示“<5”,“<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)

这个的最佳替代方案是什么?

r range
2个回答
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会发生什么。


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)
© www.soinside.com 2019 - 2024. All rights reserved.