我的分数范围很广。我想计算行之间固定长度范围的平均值。(找到固定范围和平均值)
让我们说: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中做到这一点,我会很感激。
答案 0 :(得分:5)
一种方法是尝试dplyr
。在这里,我们使用{{1}根据grp
的当前行和后续行之间的差异是否大于start
或5
来创建分组变量diff(start)>5
在与cumsum
连接后,TRUE
输出的长度将比diff
长1
。完成分组nrow(df)
后,使用group_by(...)
并为summarise
选择start
(start[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