使用dplyr将组汇总为间隔

spo*_*234 5 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.20697918  0.5105118
5 0.4 -2.16698578 -1.0120544
6 0.5  0.33886508  0.4797016
Run Code Online (Sandbox Code Playgroud)

我现在想要一个新的数据框,该数据框汇总所有区间0-0.99、1-1.99、2-2.99、3-3.99 ...中的值。

像这样

start end mean.v2 mean.v3
    0   1     0.2     0.1
    1   2     0.5     0.4
Run Code Online (Sandbox Code Playgroud)

等等

谢谢

更新,我应该补充一点,在我的真实数据集中,每个时间间隔的观察值具有不同的长度,并且它们并不总是从零开始或以10结束

Dav*_*ann 5

这是cut()@akrun建议的一种使用方式:

d %>% mutate( ints = cut(v1 ,breaks = 11)) %>% 
   group_by(ints) %>% 
   summarise( mean.v2 = mean(v2) , mean.v3 = mean(v3) )
Run Code Online (Sandbox Code Playgroud)


Pau*_*eux 5

基于@David H"s 的回答,有 2 个选项可供选择:

  1. cut()使用中断向量生成间隔
  2. 生成间隔,floor()而不是cut()

创建数据

set.seed(33)
d <- data.frame(v1=seq(0,9.9,0.1),
            v2=rnorm(100),
            v3=rnorm(100))
Run Code Online (Sandbox Code Playgroud)

cut()使用中断向量生成间隔

对于这个简单的例子,您可以使用breaks <- 0:10,但为了更一般化,让我们取 的最小值和最大值d$v1

breaks <- floor(min(d$v1)):ceiling(max(d$v1))
breaks 
# [1]  0  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

对区间 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
Run Code Online (Sandbox Code Playgroud)

生成间隔,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
Run Code Online (Sandbox Code Playgroud)