Como criar um vetor R vazio para adicionar novos itens

92

Quero usar R em Python, conforme fornecido pelo módulo Rpy2. Percebo que R tem []operações muito convenientes pelas quais você pode extrair as colunas ou linhas específicas. Como posso realizar essa função por meio de scripts Python?

Minha ideia é criar um vetor R e adicionar esses elementos desejados a este vetor de forma que o vetor final seja o mesmo de R. Eu criei a seq(), mas parece que ele tem um dígito inicial 1, então o resultado final sempre seria comece com o dígito 1, que não é o que desejo. Então, existe uma maneira melhor de fazer isso?

Ligwin
fonte

Respostas:

94
vec <- vector()

Veja também a ajuda do vetor

?vector
Brani
fonte
56

Eu pré-aloco um vetor com

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

Você pode então usar [] para inserir valores nele.

Roman Luštrik
fonte
Esta é a melhor resposta se o comprimento do vetor for conhecido desde o início, pois ele será mais eficiente em termos de memória
stevec
25

Você pode criar um vetor vazio como este

vec <- numeric(0)

E então adicione elementos usando c ()

vec <- c(vec, 1:5)

No entanto, como diz Romunov, é muito melhor pré-alocar um vetor e, em seguida, populá-lo (pois isso evita realocar uma nova cópia do seu vetor toda vez que você adiciona elementos)

Aaron Statham
fonte
Gosto da sua solução com numeric (), mas minha experiência me levou a usar NA em vez de 0 (se você usar numérico (2), obterá 0 0). Mas essa é minha preferência pessoal.
Roman Luštrik
Muito Obrigado!! Mas é possível liberar o anterior após a adição de um novo elemento? devo simplesmente usar rm ()?
ligwin
Existe outro problema que typeof (numeric (0)) dá "double" enquanto os elementos desejados dão "integer", quando adicionados, foi gerado um erro dizendo "O tipo para o novo valor não pode ser diferente", como converter?
ligwin
ao trabalhar em python, o "as" é uma palavra-chave, além disso, python não tem esses tipos de dados, então acho que "as.integer" não funcionará?
ligwin
romunov - numérico (0) significa criar um vetor numérico com comprimento de 0 (ou seja, sem elementos) e não um vetor de comprimento 1 com esse elemento sendo 0
Aaron Statham
6

Para criar um vetor vazio, use:

vec <- c();

Observe que não estou fazendo suposições sobre o tipo de vetor necessário, por exemplo, numérico.

Depois de criar o vetor, você pode adicionar elementos a ele da seguinte maneira:

Por exemplo, para adicionar o valor numérico 1:

vec <- c(vec, 1);

ou, para adicionar um valor de string "a"

vec <- c(vec, "a");
Eldaw
fonte
4
Você realmente tentou isso? vec <- c()define vec para NULL. Se você quiser um vetor vazio, você deve usar vec <- character(), vec <- numeric()etc.
Matthew Wise,
5

Eu também vi

x <- {}

Agora você pode concatenar ou vincular um vetor de qualquer dimensão a x

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)
JoFrhwld
fonte
2
Isso é exatamente o mesmo que x <- NULLe não cria nada mais do que uma referência a lugar nenhum.
Joris Meys
3

Como apontado por Brani, vector () é uma solução, por exemplo

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

retornará um vetor denominado "newVector" com 50 "0" como valores iniciais. Também é bastante comum apenas adicionar o novo escalar a um vetor existente para chegar a um vetor expandido, por exemplo

aVector <- c(aVector, newScalar)

Sam
fonte
2

No rpy2, a maneira de obter o mesmo operador que "[" com R é usar ".rx". Veja a documentação sobre como extrair com rpy2

Para criar vetores, se você souber usar o Python, não deve haver nenhum problema. Veja a documentação sobre a criação de vetores

lgautier
fonte
Eu costumava criar uma função em python para esse propósito, o que é muito complicado e não tenho certeza de quão amplamente ela poderia se aplicar. Agora eu acho que com esses operadores, a vida poderia ser muito mais fácil :)
ligwin