如何从切割点向量计算中点或中位数向量?

8
假设我有一个切割点的向量,为了解答这个问题,它是这样生成的:
> seq(0,50,10)
[1]  0 10 20 30 40 50

这是一个长度为6的数字向量。我想生成一个中点的数字向量,以获得以下任意一种(两者都符合我的要求),长度比切割点少一个(在此情况下为5)。

# midpoints, exactly
5 15 25 35 45
# medians excluding right
4.5 14.5 24.5 34.5 44.5

没有找到现成的函数,于是我开发了一个过程,它接受一个数值向量作为参数(切点),并返回一个向量(中点)。它的工作原理是取索引1和索引2的中位数,并将其附加到向量中,然后取索引2和索引3的中位数,依此类推,直到最后一个索引为空。

我肯定不是第一个有这个需求的人。是否有一个包含此类过程的软件包?我不介意自己编写,但老实说,我更愿意使用经过公众审查严苛的软件包。

谢谢


1
将diff(vec)添加到head(vec, -1)的开头 - IRTFM
@BondedDust - 确定是 diff(vec)/2 吗? - thelatemail
2个回答

13

让步一下?

a <- seq(0,50,10)
a[-length(a)] + diff(a)/2

是的,Neal,谢谢。我犹豫是否要公开我的解决方案,我的大脑已经被Perl搞得一团糟,但这是我的尝试。与你的结果相同,但你的显然更好。+1。 t <- function(nv) { old.len <- length(nv) new.len <- old.len - 1 vec <- numeric(new.len) i <- 1 while(i < old.len) { midpoint <- (nv[i] + nv[i+1]) / 2 vec[i] <- midpoint i <- i + 1 } return(vec) } - ccc31807

5

另一种尝试是使用filter,这将允许您在中间权衡一个中点,或者稍微向左或向右:

x <- seq(0,50,10)

head(filter(x, c(0.5,0.5)), -1)
#[1]  5 15 25 35 45

head(filter(x, c(0.75,0.25)), -1)
#[1]  7.5 17.5 27.5 37.5 47.5

head(filter(x, c(0.25,0.75)), -1)
#[1]  2.5 12.5 22.5 32.5 42.5

还可以在内联定义的 x 上使用(不需要存储 x),例如 head(filter(1:10, c(.5, .5)), -1) - MichaelChirico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接