Group/bin/bucket R 中的数据并获取每个桶的计数和每个桶的值总和
Group/bin/bucket data in R and get count per bucket and sum of values per bucket
我要bucket/group/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 的总和和计数
根据评论,"C2" 似乎是 "character" 列,后缀为 %
。在创建组之前,使用 sub
删除 %
,转换为 "numeric" (as.numeric
)。变量 "group" 是通过使用函数 cut
和 breaks
(组 buckets/intervals)和 labels
(对于所需组标签)参数。创建组变量后,"group" 的 "C1" 的 sum
和 "group" 中元素的 "count" 可以使用 aggregate
完成来自 "base R"
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=
和summarize/create指定"grouping"变量,list(
内的两个变量"Count"和"Sum"。 .N
给出每个 "group".
中的元素数
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")
我要bucket/group/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 的总和和计数
根据评论,"C2" 似乎是 "character" 列,后缀为 %
。在创建组之前,使用 sub
删除 %
,转换为 "numeric" (as.numeric
)。变量 "group" 是通过使用函数 cut
和 breaks
(组 buckets/intervals)和 labels
(对于所需组标签)参数。创建组变量后,"group" 的 "C1" 的 sum
和 "group" 中元素的 "count" 可以使用 aggregate
完成来自 "base R"
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=
和summarize/create指定"grouping"变量,list(
内的两个变量"Count"和"Sum"。 .N
给出每个 "group".
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")