我想创建一个变量,根据binwidth
从另一个变量中存储值如果我想根据计数创建一个bin变量,那么数据看起来就像这样:
1 to 5 = 1
6 to 10 = 2
11 to 15 = 3
没有手动重新编码每个bin是否有一个函数可以在R?
中执行类似的操作答案 0 :(得分:2)
由于您希望获得数字而非结果因素,请尝试trunc((mydata$count-1)/5)+1
e.g。
mydata$bucket = trunc((mydata$count-1)/5)+1
还有ceiling
功能,这有点简单:
mydata$bucket = ceiling(mydata$count/5)
请参阅?round
关于你的数据:
mydata = data.frame(spend=c(21,32,34,43,36,39,33,47,47,47,25,50,44,44) ,
count=c(3L,1L,2L,15L,1L,8L,1L,11L,15L,11L,3L,12L,11L,4L) )
mydata$bucket = ceiling(mydata$count/5)
给出了:
> mydata
spend count bucket
1 21 3 1
2 32 1 1
3 34 2 1
4 43 15 3
5 36 1 1
6 39 8 2
7 33 1 1
8 47 11 3
9 47 15 3
10 47 11 3
11 25 3 1
12 50 12 3
13 44 11 3
14 44 4 1
答案 1 :(得分:1)
是的,它被称为切割功能 ?切割
答案 2 :(得分:1)
您可以使用通用cut()
函数。对于数字向量x
,该方法具有以下参数:
> args(cut.default)
function (x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE,
dig.lab = 3L, ordered_result = FALSE, ...)
论证breaks
在这里是核心。 要么要么,要么或定义间隔的“断点”向量。请注意,所有区间默认为右开(right = TRUE
),因此通过创建对象x
,包含1到100之间的数字并定义断点向量( brk
){1,20,50,100},您将获得这些结果(在结果上使用table()
后):
> x <- 1:100
> brk <- c(1,20,50,100)
> table(cut(x = x, breaks = brk))
(1,20] (20,50] (50,100]
19 30 50
你可以看到第一个区间是$(1,\,20)$,所以1不是它的一部分,第一个观察将成为缺失值NA
(因为定义之外的所有其他观察间隔)。
通过设置include.lowest = TRUE
,R包含最低值(即第一个间隔将被关闭),所以我认为这将产生你想要的东西:
> x <- 1:100
> brk <- c(1,20,50,100)
> table(cut(x = x, breaks = brk, include.lowest = TRUE))
[1,20] (20,50] (50,100]
20 30 50
参数right
会反转整个过程,因此默认情况下会间隔打开,而include.lowest
会关闭最后间隔(即包含最高最后一类中的值。)
由于生成的对象属于类"factor"
,您可以考虑将ordered_result
设置为TRUE
,生成有序因子对象(类"ordered"
和{{1} })。
标签等是可选的(参见"factor"
)。
答案 3 :(得分:0)
cut函数实际上可以实现对变量进行分箱,同时将其保持为连续变量,只需使用labels参数:
myData$bucket <- cut(myData$counts, breaks = 30, labels = rep(1:30))