Расщепление вектора / массива в R - PullRequest
1 голос
/ 21 марта 2012

Я хотел бы использовать 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.Я не могу понять, почему второй созданный вектор (называемый справа) имеет эти дополнительные записи.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Вы столкнулись с (общеизвестной) проблемой, вызванной более высоким приоритетом оператора для ":", чем для "+":

ceiling(inplen/2)+1:inplen
[1]  6  7  8  9 10 11 12 13 14

NA возвращаются, потому что ваш индекс превысил длину вектора.

2 голосов
/ 21 марта 2012

Вам не хватает скобки:

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

Вместо того, чтобы выбирать элементы с 2 по 4, мы выбрали элементы с 1 по 4 по ошибке.

1 голос
/ 21 марта 2012

Вы можете использовать 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
...