如何在 R 中的分箱数据上收集额外的行数据
How collect additional row data on binned data in R
我想将一个 data.frame 列的值排序到预定的 bin 中,然后对同一行中的值求和,但我尝试做的另一个 column.What 是对数据框进行排序根据一个值将项目列到箱子中,然后获得附加到箱子中所有项目的项目的第二个值的总和。有人可以帮助我吗?
我的数据是这样的
df =
Item valueX valueY
A 169849631 0.9086560
B 27612064 0.9298379
C 196651878 1.6516654
D 33007984 1.3397873
E 23019448 -0.2954385
F 54779712 -1.6888178
我的垃圾箱是这样的
Bins=
start end
1 249982
249983 499963
499964 749945
749946 999926
999927 1249907
1249908 1499889
我想要一个看起来像这样的数据框(频率和 sumvalueY 列中的假设值)
resultsdf=
binstart binend frequency sumvalueY
1 249982 0 0
249983 499963 5 200
499964 749945 6 400
749946 999926 0 0
999927 1249907 12 30
1249908 1499889 0 0
这是我的代码(当前迭代)
Start = Bins[,1]
End = Bins[,2]
myfunction <- function(Start,End) {
sum(df$valueX >= Start & df$valueX < End, df[,2])}
Binssorted = mapply(myfunction, Start,End)
有多种方法可以做到这一点。这是一个使用 dplyr
包的方法。我创建了一些假数据以供说明。
library(dplyr)
# Fake data
set.seed(5) # For reproducibility
dat = data.frame(valueX = runif(1000, 1, 2e6), valueY = rnorm(1000))
现在我们将对数据进行分箱并使用管道运算符%>%
对其进行汇总,这使我们可以一个接一个地链接函数,因此我们可以一次性执行所有操作。
dat %>%
# Bin the data
mutate(bins = cut(valueX, seq(0, 2e6, 250000))) %>%
# Group data into the bins we just created
group_by(bins) %>%
# Count the number of rows in each bin and sum all the Y values in each bin
summarise(freq = n(),
sumY = sum(valueY))
bins freq sumY
1 (0,2.5e+05] 127 8.404150
2 (2.5e+05,5e+05] 127 14.988207
3 (5e+05,7.5e+05] 121 10.750580
4 (7.5e+05,1e+06] 134 -28.725949
5 (1e+06,1.25e+06] 106 17.377665
6 (1.25e+06,1.5e+06] 126 14.340313
7 (1.5e+06,1.75e+06] 119 -4.241991
8 (1.75e+06,2e+06] 140 9.312233
我想将一个 data.frame 列的值排序到预定的 bin 中,然后对同一行中的值求和,但我尝试做的另一个 column.What 是对数据框进行排序根据一个值将项目列到箱子中,然后获得附加到箱子中所有项目的项目的第二个值的总和。有人可以帮助我吗?
我的数据是这样的
df =
Item valueX valueY
A 169849631 0.9086560
B 27612064 0.9298379
C 196651878 1.6516654
D 33007984 1.3397873
E 23019448 -0.2954385
F 54779712 -1.6888178
我的垃圾箱是这样的
Bins=
start end
1 249982
249983 499963
499964 749945
749946 999926
999927 1249907
1249908 1499889
我想要一个看起来像这样的数据框(频率和 sumvalueY 列中的假设值)
resultsdf=
binstart binend frequency sumvalueY
1 249982 0 0
249983 499963 5 200
499964 749945 6 400
749946 999926 0 0
999927 1249907 12 30
1249908 1499889 0 0
这是我的代码(当前迭代)
Start = Bins[,1]
End = Bins[,2]
myfunction <- function(Start,End) {
sum(df$valueX >= Start & df$valueX < End, df[,2])}
Binssorted = mapply(myfunction, Start,End)
有多种方法可以做到这一点。这是一个使用 dplyr
包的方法。我创建了一些假数据以供说明。
library(dplyr)
# Fake data
set.seed(5) # For reproducibility
dat = data.frame(valueX = runif(1000, 1, 2e6), valueY = rnorm(1000))
现在我们将对数据进行分箱并使用管道运算符%>%
对其进行汇总,这使我们可以一个接一个地链接函数,因此我们可以一次性执行所有操作。
dat %>%
# Bin the data
mutate(bins = cut(valueX, seq(0, 2e6, 250000))) %>%
# Group data into the bins we just created
group_by(bins) %>%
# Count the number of rows in each bin and sum all the Y values in each bin
summarise(freq = n(),
sumY = sum(valueY))
bins freq sumY
1 (0,2.5e+05] 127 8.404150
2 (2.5e+05,5e+05] 127 14.988207
3 (5e+05,7.5e+05] 121 10.750580
4 (7.5e+05,1e+06] 134 -28.725949
5 (1e+06,1.25e+06] 106 17.377665
6 (1.25e+06,1.5e+06] 126 14.340313
7 (1.5e+06,1.75e+06] 119 -4.241991
8 (1.75e+06,2e+06] 140 9.312233