簡體   English   中英

使用dplyr將組匯總到間隔

[英]summarize groups into intervals using 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

我現在想要一個新的數據框,它總結了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

等等

謝謝

更新我應該補充一點,在我的實際數據集中,每個區間的觀察結果具有不同的長度,並且它們並不總是從零開始或在10結束時結束。

這是使用@akrun建議的cut()一種方法:

d %>% mutate( ints = cut(v1 ,breaks = 11)) %>% 
   group_by(ints) %>% 
   summarise( mean.v2 = mean(v2) , mean.v3 = mean(v3) )

基於@David H的回答,有2個選項可供選擇:

  1. 使用break cut()的向量生成帶cut()間隔
  2. 使用floor()而不是cut()生成間隔

創建數據

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

使用break cut()的向量生成帶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

總結間隔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

使用floor()和ceiling()函數。 例如,在間隔為1 - 1或2 - 2的情況下,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

相同但包括一個名為interval而不是兩個(開始和結束)的列:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM