从 cmets 来看,“C2”似乎是“字符”列,后缀为 %。在创建组之前,使用sub 删除%,转换为“数字”(as.numeric)。变量“组”是通过使用带有breaks(组桶/间隔)和labels(用于所需组标签)参数的函数cut创建的(transform(df,...))。一旦创建了组变量,“组”的“C1”的sum和“组”中元素的“计数”可以使用“base R”中的aggregate来完成
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= 指定“分组”变量,并在list( 中汇总/创建两个变量“Count”和“Sum”。 .N 给出每个“组”中元素的数量。
library(data.table)
setDT(df1)[, list(Count=.N, Sum=sum(C1)), by=group][]
或使用dplyr。 %>% 将 LHS 与 RHS 参数连接起来,并将它们链接在一起。使用group_by 指定“组”变量,然后使用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")