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.