我有分数的范围.我想计算行之间固定长度范围的平均值.(找到固定范围和平均值)
让我们说: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
Run Code Online (Sandbox Code Playgroud)
我想做这样的表: df2
start end avg
100 115 2.4
130 140 1.3
200 215 5.4
Run Code Online (Sandbox Code Playgroud)
固定范围是指之间的行差;例如:在第3行的df1所述differenece是5 (100-105-110),然后在排4它跳进130.因此,检测到的连续范围来自100 to 115)
如果你告诉我怎么能在R中做到这一点,我会很感激
一种方法是尝试dplyr.在这里,我们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
Run Code Online (Sandbox Code Playgroud)
或使用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)))]
Run Code Online (Sandbox Code Playgroud)
或使用 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
Run Code Online (Sandbox Code Playgroud)
df <- structure(list(start = c(100L, 105L, 110L, 130L, 135L, 200L,
205L, 210L), end = c(105L, 110L, 115L, 135L, 140L, 205L, 210L,
215L), score = c(2.2, 2.4, 2.6, 1.4, 1.2, 5, 5.8, 5.4)), .Names = c("start",
"end", "score"), class = "data.frame", row.names = c(NA, -8L))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |