我是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)
最好的选择是什么?
答案 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
会发生什么。