来自同一列中多个变量的频率分组

时间:2017-11-13 19:22:42

标签: r dataframe frequency

使用R,我将表格分成两列,即变量和值。有多个变量,值表示长度。我想最后得到三个列:变量,固定的预定箱和每个变量的每个箱的频率。

示例数据:

原始表/数据框:

Var Value
a   509
a   1000
b   251
b   330
...

新表/数据框:

Var Bin       Count
a   0-250     50
a   251-500   30
a   501-1000  1
b   0-250     80
b   251-500   55
b   501-1000  30
...

1 个答案:

答案 0 :(得分:1)

令我惊讶的是,我没有找到一个重复的问题来搜索问题的标题。

因此,以下是在基础R,cut()dplyr中使用data.table的三种可能解决方案。

# pre-define break points of bins
breaks <- seq(0L, 1000L, by = 250L)

请注意,默认情况下cut()会创建左开,右闭的时间间隔,例如,
250 < x <= 500
对于第一个间隔,参数include.lowest = TRUE也强制左闭合间隔,例如,
0 <= x <= 250
这看起来与OP的预期产出一致。

基础R

with(DF, table(Var, cut(Value, breaks, include.lowest = TRUE)))
Var [0,250] (250,500] (500,750] (750,1e+03]
  a       0         0         1           1
  b       1         2         0           0

dpylr

library(dplyr)
DF %>% 
  group_by(Var, Bin = cut(Value, breaks, include.lowest = TRUE)) %>% 
  count()
# A tibble: 4 x 3
# Groups:   Var, Bin [4]
    Var         Bin     n
  <chr>      <fctr> <int>
1     a   (500,750]     1
2     a (750,1e+03]     1
3     b     [0,250]     1
4     b   (250,500]     2

data.table

library(data.table)
setDT(DF)[, .N, by = .(Var, Bin = cut(Value, breaks, include.lowest = TRUE))] 
   Var         Bin N
1:   a   (500,750] 1
2:   a (750,1e+03] 1
3:   b     [0,250] 1
4:   b   (250,500] 2

数据

library(data.table)
DF <- fread("Var Value
a   509
a   1000
b   0
b   251
b   330")