2010-08-05 3 views
77

Я хочу использовать R в Python, как это предусмотрено модулем Rpy2. Я замечаю, что R имеет очень удобные операции [], с помощью которых вы можете извлекать определенные столбцы или строки. Как я могу достичь такой функции с помощью скриптов Python?Как создать пустой вектор R для добавления новых элементов

Моя идея - создать вектор R и добавить эти нужные элементы в этот вектор, чтобы конечный вектор был таким же, как в R. Я создал seq(), но кажется, что он имеет начальную цифру 1, поэтому конечный результат всегда начинался с цифры 1, чего я не хочу. Итак, есть ли лучший способ сделать это?

ответ

43

я предварительно выделить вектор с

> (a <- rep(NA, 10)) 
[1] NA NA NA NA NA NA NA NA NA NA 

Вы можете использовать [], чтобы вставить значения в него.

+7

Вам не нужно 'c()'. 'a <-rep (NA, 10)' работает. И можно заставить класс вектора использовать определенный тип 'NA', например: rep (NA_integer_, 10)' (см. 'Help (" NA ")'). – Marek

+0

Конечно, вы могли бы отбросить c(), старший момент с моей стороны. Хорошая информация Марек, спасибо. –

21

Вы можете создать пустой вектор, как так

vec <- numeric(0) 

А затем добавить элементы, используя с()

vec <- c(vec, 1:5) 

Однако, как говорит romunov, это гораздо лучше предварительно выделить вектор, а затем (поскольку это позволяет избежать перераспределения новой копии вашего вектора при каждом добавлении элементов)

+0

Мне нравится ваше решение с числовым(), но мой опыт заставил меня использовать NA вместо 0 (если вы используете числовое (2), вы получите 0 0). Но это мое личное предпочтение. –

+0

Большое спасибо! Но можно ли освободить предыдущий после добавления одного нового элемента? Должен ли я просто использовать rm()? – ligwin

+0

Существует еще одна проблема, что typeof (numeric (0)) дает «double», тогда как нужные элементы дают «integer», при добавлении возникает ошибка: «Тип для нового значения не может быть другим», как преобразовать? – ligwin

87
vec <- vector() 

См. Также вектор поможет

?vector 
+3

Это лучшая стратегия использования. – Kevin

+3

Отличный ответ и может даже уменьшить риск ошибки при наличии остаточного индекса или NA, плавающего вокруг! В любом случае, это именно то, что мне нужно. – Mnescat

+2

Я только что заметил, что я уже был здесь некоторое время назад и поддерживался. Хорошо еще раз спасибо ;-) – greg121

4

Я также видел

x <- {} 

Теперь вы можете сцепить или связать вектор любой размерности к x

rbind(x, 1:10) 
cbind(x, 1:10) 
c(x, 10) 
+1

Это точно так же, как 'x <- NULL', и не создает ничего, кроме ссылки в никуда. –

1

В rpy2, как получить тот же оператор, что и «[» с R, должен использовать «.rx». См. Документацию о extracting with rpy2

Для создания векторов, если вы знаете свой путь с помощью Python, не должно быть никаких проблем. См. Документацию о creating vectors

+0

Я использовал для создания функции в python для этой цели, что очень сложно, и я не уверен, насколько широко он может применяться. Теперь я думаю, что с этими операторами жизнь может быть намного проще :) – ligwin

2

Как указано Брани, вектор() является решением, например.

newVector <- vector(mode = "numeric", length = 50)

возвращает вектор с именем "newVector" 50 "0" 's в качестве начальных значений. Также довольно просто добавить новый скаляр в существующий вектор, чтобы получить расширенный вектор, например.

aVector <- c(aVector, newScalar)

3

Чтобы создать пустой вектор использования:

vec <- c(); 

Обратите внимание, я не делаю никаких предположений о типе вектора вам требуется, например, Числовой.

После того, как вектор был создан, Вы можете добавить в него элементы следующим образом:

Например, чтобы добавить числовое значение 1:

vec <- c(vec, 1); 

или, чтобы добавить строковое значение «а»

vec <- c(vec, "a"); 
+2

Вы на самом деле пробовали это? 'vec <- c()' устанавливает vec в 'NULL'. Если вы хотите использовать пустой вектор, вы должны использовать 'vec <- character()', 'vec <- numeric()' и т. Д. –

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