Eu tenho um quadro de dados como:
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
Tentei o seguinte para converter uma das colunas em um vetor, mas não funciona:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
Esta é a única solução que eu poderia encontrar, mas estou assumindo que deve haver uma maneira melhor de fazer isso:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
Nota: Meu vocabulário acima pode estar desativado, por favor, corrija-me se estiver. Ainda estou aprendendo o mundo da R. Além disso, qualquer explicação sobre o que está acontecendo aqui é apreciada (por exemplo, relacionada ao Python ou a alguma outra linguagem ajudaria!)
r
dataframe
vector
type-conversion
Dolan Antenucci
fonte
fonte
?'[.data.frame'
o levará muito longe.Respostas:
Vou tentar explicar isso sem cometer erros, mas aposto que isso atrairá um ou dois esclarecimentos nos comentários.
Um quadro de dados é uma lista. Quando você define um quadro de dados usando o nome de uma coluna e
[
, o que você recebe é uma sub- lista (ou um quadro de sub-dados). Se você quiser a coluna atômica real, poderá usar[[
, ou de alguma maneira confusa (para mim), oaframe[,2]
que retorna um vetor, não uma sub-lista.Portanto, tente executar esta sequência e talvez as coisas sejam mais claras:
fonte
aframe[,"a2"]
por causa da capacidade de usar isso com quadros de dados e matrizes e parece obter os mesmos resultados - um vetor.[..., drop = F]
sempre retornará um quadro de dadosdf$x
sintaxe retorna um vetor. Eu usei essa sintaxe por um longo tempo, mas quando tive que começar a usardf['name']
oudf[n]
recuperar colunas, encontrei problemas ao tentar enviá-los para funções que esperavam vetores. Usardf[[n]]
oudf[['x']]
limpar as coisas corretamente.as.vector
parece silenciosamente não ter efeito? Isso não deveria retornar um vetor ou falha conspicuamente?aframe[['a2']]
é muito útil comsf
objetos, poisaframe[,"a2"]
retornará duas colunas porque a coluna geométrica está incluída.Agora existe uma maneira fácil de fazer isso usando
dplyr
.fonte
Você pode usar a
$
extração:ou o suporte quadrado duplo:
fonte
Você não precisa
as.vector()
, mas precisa de indexação correta:avector <- aframe[ , "a2"]
A outra coisa a ter em atenção é a
drop=FALSE
opção de[
:fonte
drop=FALSE
é útil - isso me ajuda nos casos em que posso selecionar N colunas de um data.frame, nos casos em que N = 1.Outra vantagem de usar o operador '[[' é que ele funciona tanto com data.frame quanto data.table. Portanto, se a função precisar ser executada para data.frame e data.table e você desejar extrair uma coluna dela como um vetor,
é melhor.
fonte
Você pode tentar algo assim-
fonte
identical
.Se você apenas usar o operador de extração, ele funcionará. Por padrão, [] define a opção
drop=TRUE
, que é o que você deseja aqui. Veja?'['
para mais detalhes.fonte
fonte
fonte
Uso listas para filtrar quadros de dados, independentemente de terem ou não um valor% em% uma lista.
Eu estava criando listas manualmente exportando um dataframe de 1 coluna para o Excel, onde adicionaria "", em torno de cada elemento, antes de colar na lista R: <- c ("el1", "el2", ...) que normalmente era seguido por FilteredData <- subconjunto (Dados, coluna% na lista%).
Depois de pesquisar o stackoverflow e não encontrar uma maneira intuitiva de converter um quadro de dados de 1 coluna em uma lista, agora estou postando minha primeira contribuição de stackoverflow:
fonte
Também podemos converter genericamente colunas data.frame em um vetor simples.
as.vector
não é suficiente, pois retém a classe e a estrutura data.frame; portanto, também precisamos extrair o primeiro (e único) elemento:Todas as soluções sugeridas até o momento requerem códigos de coluna codificados. Isso os torna não genéricos (imagine aplicar isso aos argumentos da função).
Como alternativa, você pode, é claro, ler primeiro os nomes das colunas e depois inseri-los no código nas outras soluções.
fonte