我希望存储桶/组/bin数据:
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的总和和计数
发布于 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”。
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.table。setDT将data.frame转换为data.table。使用by=指定"grouping“变量,并在list(中汇总/创建两个变量"Count”和"Sum“。.N给出了每个“组”内的元素计数。
library(data.table)
setDT(df1)[, list(Count=.N, Sum=sum(C1)), by=group][]或者使用dplyr。%>%将LHS与RHS参数连接起来,并将它们链接在一起。使用group_by指定"group“变量,然后使用summarise_each或summarise获取相关列的汇总计数和sum。如果有多个列,则summarise_each将非常有用。
library(dplyr)
df1 %>%
group_by(group) %>%
summarise_each(funs(n(), Sum=sum(.)), C1)更新
使用新数据集df
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方法是相同的
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数据
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")https://stackoverflow.com/questions/27762606
复制相似问题