Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr将组汇总为间隔_R_Dplyr - Fatal编程技术网

使用dplyr将组汇总为间隔

使用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

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
等等

谢谢


更新我应该补充的是,在我的真实数据集中,每个间隔的观测值长度不同,它们并不总是从零开始,也不总是从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