我有一个数字向量x
和一个data.frame startEnd
,其中包括具有开始行和结束行的列。
> head(x)
23.80077 23.72072 23.64067 23.56062 23.48056 23.40051
> head(startEnd)
rowStart rowEnd
1 43 435
2 486 887
3 898 1325
4 1327 1742
5 1757 2196
6 2220 2646
我想计算从每个rowStart到代表行endEnd的向量x
的中位数。我已经有一个可行的解决方案:
for(i in 1:nrow(startEnd)){
x_median[i] = median(x[startEnd$rowStart[i]:startEnd$rowEnd[i]])
}
我可以很容易地将其转换为申请书,但我正在寻找一种更有效的方法。我还考虑过通过使用间隔将向量拆分为一个列表,然后在每个列表元素上应用中位数。有什么建议吗?
答案 0 :(得分:0)
x <- rnorm(3000) + 23
startEnd <- data.frame(
rowStart = c(43L, 486L, 898L, 1327L, 1757L, 2220L),
rowEnd = c(435L, 887L, 1325L, 1742L, 2196L, 2646L)
)
mapply(function(s, e) {median(x[s:e])}, startEnd[["rowStart"]], startEnd[["rowEnd"]])
# [1] 23.12682 23.10009 22.99902 22.99883 23.08723 23.01746