Estou tentando aprender R e não consigo descobrir como anexar a uma lista.
Se fosse Python, eu faria. . .
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
Como você faz isso no 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
; ou você pode fazer vector = vector + values. Mas eu posso estar entendendo mal o seu caso de usoRespostas:
Anexar a um objeto em um loop for faz com que o objeto inteiro seja copiado em todas as iterações, o que faz com que muitas pessoas digam "R é lento" ou "R loops devem ser evitados".
Como BrodieG mencionou nos comentários: é muito melhor pré-alocar um vetor do comprimento desejado, depois defina os valores dos elementos no loop.
Aqui estão várias maneiras de acrescentar valores a um vetor. Todos eles estão desencorajados.
Anexando a um vetor em um loop
help("append")
teria respondido à sua pergunta e economizado o tempo que você levou para escrever essa pergunta (mas teria feito com que você desenvolvesse maus hábitos). ;-)Observe que
vector <- c()
não é um vetor vazio; ele éNULL
. Se você deseja um vetor de caractere vazio, usevector <- character()
.Aloque previamente o vetor antes de fazer o loop
Se você absolutamente precisar usar um loop for, pré-aloque todo o vetor antes do loop. Isso será muito mais rápido do que o anexo para vetores maiores.
fonte
vector <- character(length(values)); for(...
)?FWIW: análogo ao append do python ():
fonte
b <- 1; b <- append(b, 2)
. Mas como você mencionou, c () é uma maneira mais R de fazer as coisas.Você tem poucas opções:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
O primeiro é a abordagem padrão. O segundo oferece a opção de acrescentar outro lugar que não o final. O último é um pouco contorcido, mas tem a vantagem de modificar
vector
(embora realmente, você poderia fazer isso com a mesma facilidade)vector <- c(vector, values)
.Observe que em R você não precisa alternar entre vetores. Você pode apenas operar neles por inteiro.
Além disso, esse é um material bastante básico, então você deve passar por algumas das referências .
Mais algumas opções baseadas no feedback do OP:
fonte
c
para acrescentar dataframe em vez de vetores?Por uma questão de integridade, acrescentar valores a um vetor em um loop for não é realmente a filosofia em R.R funciona melhor operando em vetores como um todo, como @BrodieG apontou. Veja se seu código não pode ser reescrito como:
A saída será um vetor de valores de retorno. Você também pode usar
lapply
se valores for uma lista em vez de um vetor.fonte
Às vezes, temos que usar loops, por exemplo, quando não sabemos quantas iterações precisamos para obter o resultado. Tome enquanto loops como um exemplo. Abaixo estão os métodos que você absolutamente deve evitar:
Eles são muito ineficientes porque R copia o vetor toda vez que ele anexa.
A maneira mais eficiente de acrescentar é usar o índice. Observe que desta vez eu deixo repetir 1e7 vezes, mas ainda é muito mais rápido que
c
.Isso é aceitável. E podemos torná-lo um pouco mais rápido substituindo
[
por[[
.Talvez você já tenha notado que isso
length
pode consumir tempo. Se substituirmoslength
por um contador:Como outros usuários mencionaram, pré-alocar o vetor é muito útil. Mas isso é uma troca entre velocidade e uso de memória, se você não souber quantos ciclos precisa para obter o resultado.
Um método intermediário é adicionar gradualmente blocos de resultados.
fonte
No R, você pode tentar desta maneira:
fonte
fonte
O que você está usando no código python é chamado de lista em python, e é totalmente diferente dos vetores R, se eu conseguir o que você quer fazer:
fonte