假设我有这个数据库:
Bins=10
df=data.frame(Min=c(0,10,20,30), Max=c(5,16,26,38),val=c(3,11,21,31))
我想添加另一列,其中我对一列中的值进行分类(即,列调用"value"),通过在其他两列中的值之间创建的相等大小的箱子(即,列之间的分隔符称为Min和Max)。
我想我可以使用cut函数定义为打破最小和最大列之间的序列,但它不起作用。
df$bin=cut(df$val, breaks = seq(from = df$Min, to =df$Max,length.out =Bins) ,include.lowest =TRUE)
知道如何定义函数在每行上使用的断点吗?
您可以使用mutate()
和dplyr
包中的rowwise()
。
df %>%
rowwise() %>%
mutate(bin=cut(val, breaks = seq(from = Min, to =Max,length.out =Bins) ,include.lowest =TRUE))
输出:
Min Max val bin
<dbl> <dbl> <dbl> <fct>
1 0 5 3 (2.78,3.33]
2 10 16 11 (10.7,11.3]
3 20 26 21 (20.7,21.3]
4 30 38 31 (30.9,31.8]
如果不是bin
列显示因子变量的范围,您可以这样做,使bin
成为该范围的中点:
f <- function(s,e,b,val) {
x = seq(s,e,length.out = b)
max(x[x<val]) + (min(x[x>val])-max(x[x<val]))/2
}
df %>%
rowwise() %>%
mutate(bin=f(Min, Max, Bins, val))
输出:
Min Max val bin
<dbl> <dbl> <dbl> <dbl>
1 0 5 3 3.06
2 10 16 11 11
3 20 26 21 21
4 30 38 31 31.3