Converte uma linha de um quadro de dados em vetor


116

Quero criar um vetor a partir de uma linha de um quadro de dados. Mas não quero ter que nomes de linhas e colunas. Tentei várias coisas ... mas não tive sorte.

Este é o meu quadro de dados:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

Eu tentei:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

Mas eu realmente quero algo assim:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

Eu sugiro que você formate os dados que você mostrou corretamente. Parece que faltam algumas quebras de linha.
Chinmay Patil

Eu quero uma briga. Linha '1' e não coluna 'a'.
Joko

Existe uma maneira de aplicar isso a todas as linhas de um quadro de dados e, assim, fundir todos os vetores em um único vetor?
stephanmg

1
@stephanmg: E algo como c(t(as.matrix(df))):?
Andri Signorell

Andri: Isso está funcionando, embora eu também pudesse resolver de forma diferente.
stephanmg

Respostas:


154

Ao extrair uma única linha de um quadro de dados, você obtém um quadro de dados de uma linha. Converta em um vetor numérico:

as.numeric(df[1,])

Como @Roland sugere, unlist(df[1,])converterá o quadro de dados de uma linha em um vetor numérico sem descartar os nomes. Portanto, unname(unlist(df[1,]))é outra maneira um pouco mais explícita de obter o mesmo resultado.

Como @Josh comenta abaixo, se você tiver um quadro de dados não completamente numérico (alfabético, fator, misto ...), será necessário as.character(df[1,]).


pode ser +1 (ou 0 votos negativos) para o OP por fornecer um código que ilustrasse claramente o que eles queriam, embora o texto e o título da pergunta fossem truncados ...
Ben Bolker

@ChinmayPatil, quais são as outras opções? Seu exemplo de código certamente faz parecer que é isso que eles querem.
Ben Bolker

2
Deve-se notar que um quadro de dados já é um vetor e, portanto, conforme o vetor o vê, é um vetor do modo "lista" e não faz nada. Para facilitar a compreensão dos mecanismos subjacentes, tente as.vector (df [1,], mode = "numeric") que é mais ilustrativo. Isso é o que as.numeric faz.

1
sem problemas. Estou apenas afirmando que para este problema eles dão exatamente a mesma resposta.
Ben Bolker

1
Pode ter sido alterado nesse meio tempo, mas hoje não listado permite descartar nomes: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (e btw df ainda não é um nome adequado para data.frame ... ;-))
Andri Signorell

45

Eu recomendo unlist, que guarda os nomes.

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

Se você não quiser um vetor nomeado:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

Se você não quiser mudar para numérico, pode tentar isso.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
isso não faz muito sentido para mim: str(as.vector(t(df)[,1]))é num [1:3] 1 2 2.6, ou seja, seu código não converter os resultados de um vetor numérico ...
Ben Bolker

2
especificamente, quando você usa t(df)R, força o quadro de dados a uma matriz, neste caso uma matriz numérica porque todos os elementos são numéricos. Em seguida, [,1]extrai a primeira coluna (um vetor numérico, porque a dimensão redundante é descartada automaticamente). as.vector()apenas elimina os nomes (o que você também pode fazer unname()).
Ben Bolker

Parece funcionar para personagens também. Mas você está certo sobre a coerção. FWIW, minha solução funcionará em frames de dados de caracteres também .. com ressalva de todos os dados sendo convertidos em caracteres
Chinmay Patil

2
Eu diria que a unname(unlist(x))solução é um pouco melhor (mais eficiente e mais transparente).
Ben Bolker

as.vector(t(df)[,1])Eu amo isso ! Exatamente o que eu preciso!
Uther Pendragon

7

Aqui está uma dplyropção baseada:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

Observe que você deve ter cuidado se sua linha contiver um fator. Aqui está um exemplo:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

Aqui está outro exemplo (por padrão, data.frame () converte caracteres em fatores)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

Para evitar esse comportamento, você precisa cuidar do fator, antes de extraí-lo:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

Colunas de quadros de dados já são vetores, você só precisa retirá-los. Observe que você coloca a coluna desejada após a vírgula, não antes dela:

> newV <- df[,1]
> newV
[1] 1 2 4 2

Se você realmente quer uma briga, faça o que Ben disse e use as palavras corretamente no futuro.


mas acho que o OP quer a primeira linha ?
Ben Bolker

1
@BenBolker Talvez sim ... Presumi que ele queria o que seu título e sua pergunta diziam que ele queria.
Jonathan Christensen
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.