首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的Group/bin/bucket数据,并获取每桶的计数和每桶的值的总和

R中的Group/bin/bucket数据,并获取每桶的计数和每桶的值的总和
EN

Stack Overflow用户
提问于 2015-01-04 13:09:20
回答 1查看 33.3K关注 0票数 11

我希望存储桶/组/bin数据:

代码语言:javascript
复制
C1             C2       C3
49488.01172    0.0512   54000
268221.1563    0.0128   34399
34775.96094    0.0128   54444
13046.98047    0.07241  61000
2121699.75     0.00453  78921
71155.09375    0.0181   13794
1369809.875    0.00453  12312
750            0.2048   43451
44943.82813    0.0362   49871
85585.04688    0.0362   18947
31090.10938    0.0362   13401
68550.40625    0.0181   14345

我希望通过C2值来存储它,但我希望定义存储桶,例如<=0.005、<=.010、<=.014等。正如你所看到的,存储桶将是不均匀的间隔。我想要每个存储桶的C1计数以及每个存储桶的C1总数。

我不知道从哪里开始,因为我是R的新手,有没有人愿意帮我弄清楚代码,或者直接给我举一个能满足我需求的例子?

编辑:增加了另一列C3。我需要每个存储桶的C3总和,同时也需要每个存储桶的C1的总和和计数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-04 13:16:25

从评论来看,"C2“似乎是以%为后缀的"character”列。在创建群组之前,使用sub移除%,转换为"numeric“(as.numeric)。变量" group“是使用带有breaks (组存储桶/间隔)和labels (用于所需的组标签)参数的函数cut创建的(transform(df,...))。一旦创建了组变量,就可以使用来自“C1 R”的aggregate来计算" group“对"group”的计数和“group”中元素的“sum”。

代码语言:javascript
复制
df1 <-  transform(df, group=cut(as.numeric(sub('[%]', '', C2)), 
    breaks=c(-Inf,0.005, 0.010, 0.014, Inf),
      labels=c('<0.005', 0.005, 0.01, 0.014)))

 res <- do.call(data.frame,aggregate(C1~group, df1, 
        FUN=function(x) c(Count=length(x), Sum=sum(x))))

 dNew <- data.frame(group=levels(df1$group))
 merge(res, dNew, all=TRUE)
 #   group C1.Count    C1.Sum
 #1 <0.005        2 3491509.6
 #2  0.005       NA        NA
 #3   0.01        2  302997.1
 #4  0.014        8  364609.5

或者,您可以使用data.tablesetDTdata.frame转换为data.table。使用by=指定"grouping“变量,并在list(中汇总/创建两个变量"Count”和"Sum“。.N给出了每个“组”内的元素计数。

代码语言:javascript
复制
 library(data.table)
  setDT(df1)[, list(Count=.N, Sum=sum(C1)), by=group][]

或者使用dplyr%>%将LHS与RHS参数连接起来,并将它们链接在一起。使用group_by指定"group“变量,然后使用summarise_eachsummarise获取相关列的汇总计数和sum。如果有多个列,则summarise_each将非常有用。

代码语言:javascript
复制
 library(dplyr)
 df1 %>%
      group_by(group) %>% 
      summarise_each(funs(n(), Sum=sum(.)), C1)

更新

使用新数据集df

代码语言:javascript
复制
df1 <- transform(df, group=cut(C2,  breaks=c(-Inf,0.005, 0.010, 0.014, Inf),
                             labels=c('<0.005', 0.005, 0.01, 0.014)))

res <- do.call(data.frame,aggregate(cbind(C1,C3)~group, df1, 
       FUN=function(x) c(Count=length(x), Sum=sum(x))))
res
#  group C1.Count    C1.Sum C3.Count C3.Sum
#1 <0.005        2 3491509.6        2  91233
#2   0.01        2  302997.1        2  88843
#3  0.014        8  364609.5        8 268809

您可以按照上面详细介绍的方式执行merge

除了指定额外的变量外,dplyr方法是相同的

代码语言:javascript
复制
 df1%>%
      group_by(group) %>%
       summarise_each(funs(n(), Sum=sum(.)), C1, C3)
 #Source: local data frame [3 x 5]

 #  group C1_n C3_n    C1_Sum C3_Sum
 #1 <0.005    2    2 3491509.6  91233
 #2   0.01    2    2  302997.1  88843
 #3  0.014    8    8  364609.5 268809

数据

代码语言:javascript
复制
df <-structure(list(C1 = c(49488.01172, 268221.1563, 34775.96094, 
13046.98047, 2121699.75, 71155.09375, 1369809.875, 750, 44943.82813, 
85585.04688, 31090.10938, 68550.40625), C2 = c("0.0512%", "0.0128%", 
"0.0128%", "0.07241%", "0.00453%", "0.0181%", "0.00453%", "0.2048%", 
"0.0362%", "0.0362%", "0.0362%", "0.0181%")), .Names = c("C1", 
"C2"), row.names = c(NA, -12L), class = "data.frame")
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27762606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档