使用dplyr将组汇总为间隔
H,, 我有这样一个数据框:使用dplyr将组汇总为间隔,r,dplyr,R,Dplyr,H,, 我有这样一个数据框: d <- data.frame(v1=seq(0,9.9,0.1), v2=rnorm(100), v3=rnorm(100)) > head(d) v1 v2 v3 1 0.0 -0.01431916 -0.5005415 2 0.1 -1.01575590 1.5307473 3 0.2 1.00081065 -0.1730830 4 0.3 -1.2069
d <- data.frame(v1=seq(0,9.9,0.1),
v2=rnorm(100),
v3=rnorm(100))
> head(d)
v1 v2 v3
1 0.0 -0.01431916 -0.5005415
2 0.1 -1.01575590 1.5307473
3 0.2 1.00081065 -0.1730830
4 0.3 -1.20697918 0.5105118
5 0.4 -2.16698578 -1.0120544
6 0.5 0.33886508 0.4797016
等等
谢谢
更新我应该补充的是,在我的真实数据集中,每个间隔的观测值长度不同,它们并不总是从零开始,也不总是从10结束。这里有一种方法使用@akrun建议的
cut()
:
d %>% mutate( ints = cut(v1 ,breaks = 11)) %>%
group_by(ints) %>%
summarise( mean.v2 = mean(v2) , mean.v3 = mean(v3) )
基于@David H的答案,有两个选项可供选择:
cut()
生成间隔floor()
而不是cut()
set.seed(33)
d <- data.frame(v1=seq(0,9.9,0.1),
v2=rnorm(100),
v3=rnorm(100))
对间隔0-0.99、1-1.99、2-2.99、3-3.99等进行总结
d %>%
mutate(interval = cut(v1,
breaks,
include.lowest = TRUE,
right = FALSE)) %>%
group_by(interval) %>%
summarise( mean.v2 = mean(v2) , mean.v3 = mean(v3))
# Source: local data frame [10 x 3]
#
# interval mean.v2 mean.v3
# (fctr) (dbl) (dbl)
# 1 [0,1) -0.13040624 -0.20781247
# 2 [1,2) 0.26505794 0.51990167
# 3 [2,3) 0.13451628 1.12066174
# 4 [3,4) 0.23451272 -0.14773437
# 5 [4,5) 0.34326922 0.28567969
# 6 [5,6) -0.77059944 -0.16629580
# 7 [6,7) -0.17617190 0.03320797
# 8 [7,8) 0.86550135 -0.24664350
# 9 [8,9) -0.06652047 -0.27798769
# 10 [9,10] -0.10424865 0.24060163
使用floor()
而不是cut()
通过从每个间隔的末尾减去一个很小的数字1e-9
来进行一些欺骗
d %>%
mutate(start = floor(v1), end = start + 1 - 1e-9 ) %>%
group_by(start, end) %>%
summarise_each(funs(mean))
# Source: local data frame [10 x 4]
# Groups: start [?]
#
# start end mean.v2 mean.v3
# (dbl) (dbl) (dbl) (dbl)
# 1 0 1 -0.13040624 -0.20781247
# 2 1 2 0.26505794 0.51990167
# 3 2 3 0.13451628 1.12066174
# 4 3 4 0.23451272 -0.14773437
# 5 4 5 0.34326922 0.28567969
# 6 5 6 -0.77059944 -0.16629580
# 7 6 7 -0.17617190 0.03320797
# 8 7 8 0.86550135 -0.24664350
# 9 8 9 -0.06652047 -0.27798769
# 10 9 10 -0.10424865 0.24060163
例如,在间隔为1-1或2-2的情况下,使用floor()和天花()函数。以及ifelse()
d<-data.frame(v1=seq(0,9.9,0.1),
v2=rnorm(100),
v3=rnorm(100))
library(dplyr)
d%>%
mutate(start=floor(v1),
end=ifelse(ceiling(v1)==start,start+1,ceiling(v1)))%>%
group_by(start,end)%>%
summarise(mean.v2=mean(v2),
mean.v3=mean(v3))
Source: local data frame [10 x 4]
Groups: start [?]
start end mean.v2 mean.v3
(dbl) (dbl) (dbl) (dbl)
1 0 1 0.135180183 -0.36083298
2 1 2 -0.245567899 0.26827020
3 2 3 -0.051136441 0.14211666
4 3 4 0.252451303 0.38530797
5 4 5 0.007209073 0.30137345
6 5 6 -0.307008690 0.07662942
7 6 7 0.103271270 0.14734865
8 7 8 0.016753997 -0.02559756
9 8 9 -0.199958098 -0.21821830
10 9 10 0.532339512 -0.46509108
你可以使用
cut
。也许d%>%分组依据(v1=cut(v1,breaks=c(-Inf,0,0.99,1.99,2.99,Inf)))%>%总结每个(funs(平均值))
@akrun我为这个问题添加了一些进一步的信息。应该有一种方法,我不必手动设置间隔。谢谢,但我添加了一些我忘记的额外约束。每个间隔中的观测值可能不同,应该在不同的数据集中工作,具有不同的起始值和结束值。我的解决方案是不可知的关于每个间隔中的观察次数及其范围,您只需设置所需的中断次数。可能我误解了您的意思;在这种情况下,您应该提供最小的exmaple和预期输出。因此中断是类似于max(天花板(d$v1))+1的吗?是否有办法将间隔包含方括号从(..)到[…)?借助于cut
:“当中断被指定为单个数字时,数据的范围被划分为等长的中断段,然后外部限制被移开范围[…]的0.1%,”借助于cut()
告诉您它有一个参数right
。OP希望第一个间隔为0-0.99。此代码从第一个间隔中排除1,因为地板(1)==天花板(1)
。这很好,但不如使用切割()
函数及其right
参数。您是对的,这就是我使用ifelse()函数的原因。当您得到1-1时,代码被解释为2-1。但是您也可以更改代码,使其可以是0-1(在ifelse函数中)。代码用途非常广泛。
d %>%
mutate(start = floor(v1), end = start + 1 - 1e-9 ) %>%
group_by(start, end) %>%
summarise_each(funs(mean))
# Source: local data frame [10 x 4]
# Groups: start [?]
#
# start end mean.v2 mean.v3
# (dbl) (dbl) (dbl) (dbl)
# 1 0 1 -0.13040624 -0.20781247
# 2 1 2 0.26505794 0.51990167
# 3 2 3 0.13451628 1.12066174
# 4 3 4 0.23451272 -0.14773437
# 5 4 5 0.34326922 0.28567969
# 6 5 6 -0.77059944 -0.16629580
# 7 6 7 -0.17617190 0.03320797
# 8 7 8 0.86550135 -0.24664350
# 9 8 9 -0.06652047 -0.27798769
# 10 9 10 -0.10424865 0.24060163
d<-data.frame(v1=seq(0,9.9,0.1),
v2=rnorm(100),
v3=rnorm(100))
library(dplyr)
d%>%
mutate(start=floor(v1),
end=ifelse(ceiling(v1)==start,start+1,ceiling(v1)))%>%
group_by(start,end)%>%
summarise(mean.v2=mean(v2),
mean.v3=mean(v3))
Source: local data frame [10 x 4]
Groups: start [?]
start end mean.v2 mean.v3
(dbl) (dbl) (dbl) (dbl)
1 0 1 0.135180183 -0.36083298
2 1 2 -0.245567899 0.26827020
3 2 3 -0.051136441 0.14211666
4 3 4 0.252451303 0.38530797
5 4 5 0.007209073 0.30137345
6 5 6 -0.307008690 0.07662942
7 6 7 0.103271270 0.14734865
8 7 8 0.016753997 -0.02559756
9 8 9 -0.199958098 -0.21821830
10 9 10 0.532339512 -0.46509108
d%>%
mutate(start=floor(v1),
end=ifelse(ceiling(v1)==start,start+1,ceiling(v1)),
interval=paste(start,"-",end))%>%
select(-start,-end)%>%
group_by(interval)%>%
summarise(mean.v2=mean(v2),
mean.v3=mean(v3))
Source: local data frame [10 x 3]
interval mean.v2 mean.v3
(chr) (dbl) (dbl)
1 0 - 1 0.135180183 -0.36083298
2 1 - 2 -0.245567899 0.26827020
3 2 - 3 -0.051136441 0.14211666
4 3 - 4 0.252451303 0.38530797
5 4 - 5 0.007209073 0.30137345
6 5 - 6 -0.307008690 0.07662942
7 6 - 7 0.103271270 0.14734865
8 7 - 8 0.016753997 -0.02559756
9 8 - 9 -0.199958098 -0.21821830
10 9 - 10 0.532339512 -0.46509108