我想将一个data.frame列的值排序到预定的bin中,然后将相同行中的值和不同的列相加。我尝试做的是将数据帧列项排序到bin中基于一个值,然后得到附加到bin中所有项目的项目的第二个值的总和。有人能帮助我吗?
我的数据看起来像这样
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)
答案 0 :(得分:0)
有很多方法可以做到这一点。这是使用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