如何在R中收集有关分箱数据的附加行数据

时间:2015-03-03 23:31:03

标签: r binning

我想将一个data.frame列的值排序到预定的bin中,然后将相同行中的值和不同的列相加。我尝试做的是将数据帧列项排序到bin中基于一个值,然后得到附加到bin中所有项目的项目的第二个值的总和。有人能帮助我吗?

我的数据看起来像这样

df =

 Item              valueX        valueY     
A                 169849631      0.9086560 
B                  27612064      0.9298379 
C                 196651878      1.6516654 
D                  33007984      1.3397873 
E                  23019448     -0.2954385 
F                  54779712     -1.6888178

我的垃圾箱看起来像这样

Bins=
start                end
     1               249982
249983               499963
499964               749945
749946               999926
999927              1249907
1249908              1499889

我想要的数据框看起来像这样(频率和sumvalueY列中的假设值)

resultsdf=
    binstart             binend       frequency       sumvalueY 
          1               249982             0               0
     249983               499963             5             200
     499964               749945             6             400 
     749946               999926             0               0
     999927              1249907            12              30
    1249908              1499889             0               0

这是我的代码(当前迭代)

Start = Bins[,1]

End = Bins[,2]

myfunction <- function(Start,End) {
  sum(df$valueX >= Start & df$valueX < End, df[,2])}

Binssorted = mapply(myfunction, Start,End)

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。这是使用dplyr包的一个。我已经创建了一些虚假数据用于说明。

library(dplyr)

# Fake data
set.seed(5) # For reproducibility
dat = data.frame(valueX = runif(1000, 1, 2e6), valueY = rnorm(1000))

现在我们将使用管道运算符%>%对数据进行分区并对其进行汇总,这允许我们一个接一个地链接函数,因此我们可以一次性执行所有操作。

dat %>% 
  # Bin the data
  mutate(bins = cut(valueX, seq(0, 2e6, 250000))) %>%
  # Group data into the bins we just created
  group_by(bins) %>%
  # Count the number of rows in each bin and sum all the Y values in each bin
  summarise(freq = n(),
            sumY = sum(valueY))

                bins  freq       sumY
1        (0,2.5e+05]   127   8.404150
2    (2.5e+05,5e+05]   127  14.988207
3    (5e+05,7.5e+05]   121  10.750580
4    (7.5e+05,1e+06]   134 -28.725949
5   (1e+06,1.25e+06]   106  17.377665
6 (1.25e+06,1.5e+06]   126  14.340313
7 (1.5e+06,1.75e+06]   119  -4.241991
8   (1.75e+06,2e+06]   140   9.312233