Судя по комментариям, «C2» кажется «символьным» столбцом с суффиксом %
. Перед созданием группы удалите %
с помощью sub
, преобразуйте в "числовой" (as.numeric
). Переменная «группа» создается (transform(df,...)
) с помощью функции cut
с аргументами breaks
(групповые сегменты/интервалы) и labels
(для нужных групповых меток). После создания групповой переменной sum
"C1" по "группе" и "количество" элементов в "группе" можно выполнить с помощью aggregate
из "базы 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
. Укажите переменную "grouping" с помощью by=
и суммируйте/создайте две переменные "Count" и "Sum" в пределах list(
. .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")
person
akrun
schedule
04.01.2015
C2
в качестве группирующей переменной? - person akrun   schedule 05.01.2015?aggregate.formula
, т.е.formula: a formula, such as ‘y ~ x’ or ‘cbind(y1, y2) ~ x1 + x2’, where the ‘y’ variables are numeric data to be split into groups according to the grouping ‘x’ variables (usually factors).
- person akrun   schedule 05.01.2015