2013-05-15 3 views
4

Скажем, у меня есть два вектора v1 и v2 и что я хочу позвонить rbind(v1, v2). Однако предположительно length(v1)>length(v2). Из документации я прочитал, что более короткий вектор будет переработан. Вот пример этого «переработки»:R и записывать записи без одинаковой длины

> v1 <- c(1, 2, 3, 4, 8, 5, 3, 11) 
> v2 <- c(9, 5, 2) 
> rbind(v1, v2) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
v1 1 2 3 4 8 5 3 11 
v2 9 5 2 9 5 2 9 5 
  1. Есть ли простой способ я могу остановить v2 от перерабатываются и вместо того, чтобы сделать оставшиеся записи 0?
  2. Есть ли лучший способ для создания векторов и матриц?

Вся помощь очень признательна!

+1

Я думаю, что 'rbind.fill' в' plyr' пакете делает это (с '' не NA's 0's). Я не использовал его сам. – Frank

+5

Подсказка по вашему второму вопросу, почему нужно складывать объекты разной длины в матрицы? Это не Excel ... Рассмотрите возможность хранения таких объектов в списках: 'list (v1, v2)'. – flodel

ответ

14

использовать следующее:

rbind(v1, v2=v2[seq(v1)]) 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
v1 1 2 3 4 8 5 3 11 
v2 9 5 2 NA NA NA NA NA 

Почему это работает: Индексирование вектора на величину, большую, чем его длина возвращает значение NA в этой точке индекса.

#eg: 
{1:3}[c(3,5,1)] 
#[1] 3 NA 1 

Таким образом, если индекс короче один по indecies из более длинного, вы Willl получить все значения короче один плюс ряд NA «s


Обобщение :

v <- list(v1, v2) 
n <- max(sapply(v, length)) 
do.call(rbind, lapply(v, `[`, seq_len(n))) 
+0

Будет ли это работать и с матрицами? – CodeKingPlusPlus

+2

@CodeKingPlusPlus, есть только один способ узнать ...;) –

+0

@flodel, отличное дополнение! –

2

В случае, если у вас есть много векторов для rbind находя длинную и более короткие векторы могут быть утомительными. В этом случае это вариант:

require(plyr) 

rbind.fill.matrix(t(v1), t(v2)) 

или

rbind.fill(as.data.frame(t(v1)), as.data.frame(t(v2))) 
2

Хотя я думаю, что Рикардо предложил хорошее решение, что-то, как это будет работать применение функции к списку векторов вы желание привязать. Вы также можете указать символ для заполнения.

test <- list(v1,v2) 
maxlen <- max(sapply(test,length)) 
fillchar <- 0 
do.call(rbind,lapply(test, function(x) c(x, rep(fillchar, maxlen - length(x))))) 

Или избежать всех do.call(rbind безумие:

t(sapply(test, function(x) c(x, rep(fillchar, maxlen - length(x))))) 

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
#[1,] 1 2 3 4 8 5 3 11 
#[2,] 9 5 2 0 0 0 0 0 
+0

Хотя я бы не рекомендовал использовать 0 для указания каких-либо данных. 0 и NA, конечно, две разные вещи. – jbaums

+0

@ jbaums - правда, я предполагаю, что тот, кто использует этот код, тщательно обдумывает свои данные и почему они заполняют эту матрицу. – thelatemail

Смежные вопросы