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?

Respostas:


94
vec <- vector()

Veja também a ajuda do vetor

?vector

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.


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)


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");

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)

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)


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.