Я пытаюсь выучить R и не могу понять, как добавить в список.
Если бы это был Python, я бы. , ,
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
Как ты делаешь это в R?
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
vector = values
; или вы можете сделать вектор = вектор + значения. Но я мог бы неправильно понять ваш вариант использованияОтветы:
Добавление к объекту в цикле for приводит к тому, что весь объект копируется на каждой итерации, что заставляет многих людей говорить «R медленный» или «R циклов следует избегать».
Как упомянул BrodieG в комментариях: гораздо лучше предварительно выделить вектор желаемой длины, а затем установить значения элементов в цикле.
Вот несколько способов добавить значения в вектор. Все они обескуражены.
Присоединение к вектору в цикле
help("append")
ответил бы на ваш вопрос и сэкономил бы время, затрачиваемое на написание этого вопроса (но привело бы к развитию вредных привычек). ;-)Обратите внимание, что
vector <- c()
это не пустой вектор; этоNULL
. Если вы хотите пустой символьный вектор, используйтеvector <- character()
.Предварительно выделить вектор перед циклом
Если вам абсолютно необходимо использовать цикл for, вы должны предварительно выделить весь вектор перед циклом. Это будет намного быстрее, чем добавление больших векторов.
источник
vector <- character(length(values)); for(...
)?FWIW: аналог pynd's append ():
источник
b <- 1; b <- append(b, 2)
. Но, как вы упомянули, c () - это более R способ ведения дел.У вас есть несколько вариантов:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
Первый - это стандартный подход. Второй дает вам возможность добавить куда-нибудь еще, кроме конца. Последнее немного искажено, но имеет преимущество модификации
vector
(хотя на самом деле вы могли бы так же легко это сделатьvector <- c(vector, values)
.Обратите внимание, что в R вам не нужно перебирать векторы. Вы можете просто оперировать ими в целом.
Кроме того, это довольно простой материал, поэтому вы должны просмотреть некоторые ссылки .
Еще несколько опций, основанных на обратной связи с OP:
источник
c
для добавления dataframe вместо векторов?Просто для полноты, добавление значений к вектору в цикле for на самом деле не является философией в R. R работает лучше, работая с векторами в целом, как указывал @BrodieG. Посмотрите, не может ли ваш код быть переписан как:
Выходом будет вектор возвращаемых значений. Вы также можете использовать,
lapply
если значения это список, а не вектор.источник
Иногда нам приходится использовать циклы, например, когда мы не знаем, сколько итераций нам нужно, чтобы получить результат. Взять хотя бы циклы в качестве примера. Ниже приведены методы, которые вы должны избегать:
Они очень неэффективны, потому что R копирует вектор каждый раз, когда он добавляет.
Самый эффективный способ добавить это использовать индекс. Обратите внимание, что на этот раз я позволил ему повторить 1e7 раз, но это все еще намного быстрее, чем
c
.Это приемлемо И мы можем сделать это немного быстрее, заменив
[
на[[
.Может быть, вы уже заметили, что это
length
может занять много времени. Если мы заменимlength
на счетчик:Как упоминали другие пользователи, предварительное выделение вектора очень полезно. Но это компромисс между скоростью и использованием памяти, если вы не знаете, сколько циклов нужно для получения результата.
Промежуточный метод заключается в постепенном добавлении блоков результатов.
источник
В R вы можете попробовать это так:
источник
источник
То, что вы используете в коде Python, называется списком в Python, и оно полностью отличается от R-векторов, если я получу то, что вы хотите сделать:
источник