162 votes

Convertir une ligne d'un cadre de données en vecteur

Je veux créer un vecteur à partir d'une ligne d'un cadre de données. Mais je ne veux pas avoir les noms des lignes et des colonnes. J'ai essayé plusieurs choses... mais sans succès.

C'est mon cadre de données :

> 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

J'ai essayé :

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

Mais je veux vraiment quelque chose qui ressemble à ça :

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

220voto

Ben Bolker Points 50041

Lorsque vous extrayez une seule ligne d'un cadre de données, vous obtenez un cadre de données à une seule ligne. Convertissez-le en un tableau numérique :

as.numeric(df[1,])

Comme le suggère @Roland, unlist(df[1,]) convertira le cadre de données à une rangée en un tableau numérique sans supprimer les noms. Par conséquent, unname(unlist(df[1,])) est une autre façon, légèrement plus explicite, d'arriver au même résultat.

Comme le commente @Josh ci-dessous, si vous disposez d'un cadre de données qui n'est pas entièrement numérique (alphabétique, facteur, mixte ...), il vous faut as.character(df[1,]) à la place.

59voto

Roland Points 37641

Je recommande unlist qui conserve les noms.

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

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

Si vous ne voulez pas d'un vecteur nommé :

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

15voto

sbha Points 1948

Voici un dplyr option basée sur l'utilisation :

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

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

9voto

Chinmay Patil Points 9152

Si vous ne voulez pas passer en numérique, vous pouvez essayer ceci.

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

6voto

Rtist Points 391

Notez que vous devez faire attention si votre ligne contient un facteur. Voici un exemple :

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

Voici un autre exemple (par défaut, data.frame() convertit les caractères en facteurs)

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"

Pour éviter ce comportement, vous devez prendre soin du facteur, avant de l'extraire :

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"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X