R中对固定数字范围进行分组和平均

时间:2014-12-09 06:31:21

标签: r range grouping

我的分数范围很广。我想计算行之间固定长度范围的平均值。(找到固定范围和平均值)
让我们说:df1:

start   end    score
100     105     2.2
105     110     2.4
110     115     2.6
130     135     1.4
135     140     1.2
200     205     5.0
205     210     5.8
210     215     5.4

我想制作这样的表:df2

start   end   avg
100     115   2.4
130     140   1.3
200     215   5.4

固定范围是指行之间的差异;例如:在df1的前3行中,差异为5 (100-105-110),然后在行4中,它会跳转到130 。因此,检测到的连续范围是100 to 115

如果你告诉我怎么能在R中做到这一点,我会很感激。

1 个答案:

答案 0 :(得分:5)

一种方法是尝试dplyr。在这里,我们使用{{1}根据grp的当前行和后续行之间的差异是否大于start5来创建分组变量diff(start)>5在与cumsum连接后,TRUE输出的长度将比diff1。完成分组nrow(df)后,使用group_by(...)并为summarise选择startstart[1])的第一个值,grp的最后一个值(end)和end[n()]得分。 mean为分组的子集提供n()

nrow(.)

或使用library(dplyr) df %>% group_by(grp=cumsum(c(TRUE, diff(start)>5))) %>% summarise(start=start[1], end=end[n()], score=mean(score))%>% select(-grp) #as suggested by @MrFlick # start end score #1 100 115 2.4 #2 130 140 1.3 #3 200 215 5.4 。在这里,我们也在data.table总结了结果。语法为list

,而不是n()
.N

或使用library(data.table) setDT(df)[,list(start=start[1], end=end[.N], score=mean(score)) , by=list(grp=cumsum(c(TRUE, diff(start)>5)))]

base R

数据

 do.call(rbind,by(df, list(grp=cumsum(c(TRUE, diff(df$start)>5))), 
      FUN= function(x) with(x,c(start=start[1], end=end[nrow(x)],
                                          score=mean(score)))))
 #   start end score
 #1   100 115   2.4
 #2   130 140   1.3
 #3   200 215   5.4