如何对一列值求和并按另一列的间隔对它们进行分组
How to sum one column values and group them by intervals from another column
我是 R 的新手并且有一个包含 25k 行的数据框,我想将 "Freq"
输入的总和分组在 "Var1"
的范围内(假设从 5 到 5) .
想法是减少行并创建直方图。
为简单起见,这里有 20 行:
Var1 <- c(0:19)
Freq <- c(289, 370, 2295, 2691, 2206, 1624, 1267, 1076, 971, 889, 891, 834, 866, 780, 794, 809, 772, 740, 742, 734)
df <- data.frame(Var1, Freq)
这是我所期望的:
Var1_intervals <- c("0 - 4", "5 - 9", "10 - 14", "15-19")
Freq_sum <- c(7851, 5837, 4165, 3797)
df_2 <- data.frame(Var1_intervals, Freq_sum)
您可以使用 aggregate
和 cut
来 对每个区间求和 。
aggregate(df["Freq"], list(cut(df$Var1, (0:4)*5, right = FALSE)), sum)
# Group.1 Freq
#1 [0,5) 7851
#2 [5,10) 5827
#3 [10,15) 4165
#4 [15,20) 3797
这是另一个使用 tapply
的基本 R 选项
with(
df,
data.frame(
Var1 = tapply(Var1,ceiling(seq_along(Var1)/5),function(x) paste0(range(x),collapse = "-")),
Freq = tapply(Freq,ceiling(seq_along(Freq)/5),sum)
)
)
这给出了
Var1 Freq
1 0-4 7851
2 5-9 5827
3 10-14 4165
4 15-19 3797
还有另一个使用 dplyr
的解决方案:
df %>%
group_by(cut(Var1, (0:4)*5, right = FALSE)) %>%
summarise(n = sum(Freq))
选项data.table
library(data.table)
setDT(df)[, .(n = sum(Freq)), by = .(Group = findInterval(Var1, (0:4) * 5))]
为您的间隔创建 ID 列(在本例中为 5),然后分组并 summarise
library(dplyr)
df %>%
mutate(Intervals_by5 = rep(row_number(), each=5, length.out = n())) %>%
group_by(Intervals_by5) %>%
summarise(Freq_sum = sum(Freq))
输出:
Intervals_by5 Freq_sum
<int> <dbl>
1 1 7851
2 2 5827
3 3 4165
4 4 3797
我是 R 的新手并且有一个包含 25k 行的数据框,我想将 "Freq"
输入的总和分组在 "Var1"
的范围内(假设从 5 到 5) .
想法是减少行并创建直方图。
为简单起见,这里有 20 行:
Var1 <- c(0:19)
Freq <- c(289, 370, 2295, 2691, 2206, 1624, 1267, 1076, 971, 889, 891, 834, 866, 780, 794, 809, 772, 740, 742, 734)
df <- data.frame(Var1, Freq)
这是我所期望的:
Var1_intervals <- c("0 - 4", "5 - 9", "10 - 14", "15-19")
Freq_sum <- c(7851, 5837, 4165, 3797)
df_2 <- data.frame(Var1_intervals, Freq_sum)
您可以使用 aggregate
和 cut
来 对每个区间求和 。
aggregate(df["Freq"], list(cut(df$Var1, (0:4)*5, right = FALSE)), sum)
# Group.1 Freq
#1 [0,5) 7851
#2 [5,10) 5827
#3 [10,15) 4165
#4 [15,20) 3797
这是另一个使用 tapply
with(
df,
data.frame(
Var1 = tapply(Var1,ceiling(seq_along(Var1)/5),function(x) paste0(range(x),collapse = "-")),
Freq = tapply(Freq,ceiling(seq_along(Freq)/5),sum)
)
)
这给出了
Var1 Freq
1 0-4 7851
2 5-9 5827
3 10-14 4165
4 15-19 3797
还有另一个使用 dplyr
的解决方案:
df %>%
group_by(cut(Var1, (0:4)*5, right = FALSE)) %>%
summarise(n = sum(Freq))
选项data.table
library(data.table)
setDT(df)[, .(n = sum(Freq)), by = .(Group = findInterval(Var1, (0:4) * 5))]
为您的间隔创建 ID 列(在本例中为 5),然后分组并 summarise
library(dplyr)
df %>%
mutate(Intervals_by5 = rep(row_number(), each=5, length.out = n())) %>%
group_by(Intervals_by5) %>%
summarise(Freq_sum = sum(Freq))
输出:
Intervals_by5 Freq_sum
<int> <dbl>
1 1 7851
2 2 5827
3 3 4165
4 4 3797