我想使用R执行类似于合并排序的操作。我想将矢量/数组分成两部分。我的输入存在于名为inp。
的变量中> inp <- c(5,6,7,8,9,1,2,3,4)
> inplen <- length(inp)
> left <- inp[1:ceiling(inplen/2)]
> right <- inp[ceiling(inplen/2)+1:inplen]
> left
[1] 5 6 7 8 9
> right
[1] 1 2 3 4 NA NA NA NA NA
> length(left)
[1] 5
> length(right)
[1] 9
在这里你可以看到,虽然我将矢量分成两半,但是右半部分的尺寸大于左半部分的尺寸。此外,右半部分还有一些值为NA的条目。我无法弄清楚为什么创建的第二个向量(称为右)有这些额外的条目。
答案 0 :(得分:3)
由于“:”的运算符优先级高于“+”,您遇到(众所周知的)问题:
ceiling(inplen/2)+1:inplen
[1] 6 7 8 9 10 11 12 13 14
因为您的索引超出了向量的长度而返回了NA。
答案 1 :(得分:2)
你错过了一个括号:
right = inp[(ceiling(inplen/2)+1):inplen]
要扩展,假设我们有
1 + 1:3
这是1+(1:3)
还是(1+1):3
。 R将其解释为1+(1:3)
,因此当您键入1+1:3
时,您会得到:
1 + c(1,2,3)
成为
c(2,3,4)
另一个常见的问题是:
R> x = 1:5
R> x[2:length(x)-1]
[1] 1 2 3 4
我们错误地选择了元素1到4,而不是选择元素2到4。
答案 2 :(得分:1)
您可以使用split
,cut
创建断点:
split(inp,cut(seq(inplen),breaks=c(0,ceiling(inplen/2),inplen),labels=c("left","right")))
$left
[1] 5 6 7 8 9
$right
[1] 1 2 3 4