web-dev-qa-db-fra.com

Extraire des colonnes spécifiques d'un bloc de données

J'ai un cadre de données R avec 6 colonnes et je souhaite créer un nouveau cadre de données qui ne contient que trois des colonnes.

En supposant que mon bloc de données soit df et que je souhaite extraire les colonnes A, B et E, il s'agit de la seule commande que je puisse comprendre:

 data.frame(df$A,df$B,df$E)

Y a-t-il un moyen plus compact de faire cela?

338
Aren Cambre

En utilisant le package dplyr , si votre nom de domaine data.frame est appelé df1:

library(dplyr)

df1 %>%
  select(A, B, E)

Ceci peut aussi être écrit sans le pipe %>% comme:

select(df1, A, B, E)
118
Sam Firke

Vous pouvez créer un sous-ensemble en utilisant un vecteur de noms de colonnes. Je préfère fortement cette approche à celles qui traitent les noms de colonnes comme s’ils étaient des noms d’objets (par exemple, subset()), en particulier lors de la programmation dans des fonctions, des packages ou des applications.

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]
428
Joshua Ulrich

C’est le rôle de la fonction subset() :

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4
95
Stéphane Laurent

Il y a deux choix évidents: df[,c("A","B","E")] de Joshua Ulrich ou

df[,c(1,2,5)]

un péché

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8
70
Henry

Vous pouvez également utiliser le package sqldf qui effectue la sélection sur les trames de données R comme suit:

df1 <- sqldf("select A, B, E from df")

Cela donne en sortie une trame de données df1 avec des colonnes: A, B, E.

13
Aman Burman

Où df1 est votre trame de données d'origine:

df2 <- subset(df1, select = c(1, 2, 5))
10
Richard Ball

Pour une raison quelconque

df[, (names(df) %in% c("A","B","E"))]

a travaillé pour moi. Toutes les syntaxes ci-dessus ont donné "des colonnes non définies sélectionnées".

10
so860

Vous pouvez utiliser with:

with(df, data.frame(A, B, E))
1
Moody_Mudskipper

[ et le sous-ensemble ne sont pas substituables:

[ renvoie un vecteur si une seule colonne est sélectionnée.

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)
0
fxi