Как создать пустой вектор R для добавления новых элементов

93

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

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

лигвин
источник

Ответы:

95
vec <- vector()

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

?vector
Брани
источник
56

Я заранее выделяю вектор с помощью

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

Затем вы можете использовать [] для вставки в него значений.

Роман Луштрик
источник
Это лучший ответ, если длина вектора известна с самого начала, так как он будет наиболее эффективным с точки
зрения
25

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

vec <- numeric(0)

А затем добавьте элементы с помощью c ()

vec <- c(vec, 1:5)

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

Аарон Стэтхэм
источник
Мне нравится ваше решение с numeric (), но мой опыт привел меня к использованию NA вместо 0 (если вы используете numeric (2), вы получите 0 0). Но это мое личное предпочтение.
Роман Луштрик
Большое спасибо!! Но можно ли освободить предыдущий после добавления одного нового элемента? мне просто использовать rm ()?
ligwin 05
Есть еще одна проблема, что typeof (numeric (0)) дает «double», тогда как желаемые элементы дают «integer», при добавлении возникла ошибка: «Тип нового значения не может быть другим», как преобразовать?
ligwin 05
при работе в python "as" является ключевым словом, кроме того, в python нет таких типов данных, поэтому я думаю, что "as.integer" не сработает?
ligwin 05
romunov - numeric (0) означает создание числового вектора с длиной 0 (то есть без элементов), а не с вектором длины 1 с этим элементом, равным 0
Аарон Стэтхэм
7

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

vec <- c();

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

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

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

vec <- c(vec, 1);

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

vec <- c(vec, "a");
Eldaw
источник
4
Вы действительно пробовали это? vec <- c()устанавливает vec равным NULL. Если вам нужен пустой вектор, вы должны использовать vec <- character()и vec <- numeric()т. Д.
Мэтью Уайз,
5

Я также видел

x <- {}

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

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)
JoFrhwld
источник
2
Это в точности то же самое x <- NULL, что и, и не создает ничего, кроме ссылки в никуда.
Джорис Мейс
3

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

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

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

aVector <- c(aVector, newScalar)

Сэм
источник
2

В rpy2 способ получить тот же оператор, что и "[" с R, - использовать ".rx". См. Документацию по извлечению с помощью rpy2

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

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