Extraction de colonnes spécifiques à partir d'une base de données

j'ai un cadre de données R avec 6 colonnes, et je veux créer un nouveau cadre de données qui n'a que trois des colonnes.

en supposant que ma base de données est df , et je veux extraire les colonnes A , B , et E , c'est la seule commande que je peux comprendre:

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

Est-il une façon plus compacte de faire cela?

287
demandé sur Aren Cambre 2012-04-10 06:24:04

8 réponses

utilisant le paquet dplyr , si vos données.le cadre est appelé df1 :

library(dplyr)

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

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

select(df1, A, B, E)
45
répondu Sam Firke 2015-04-19 21:19:17

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'il s'agissait de noms d'objets (par exemple subset() ), surtout lorsqu'il s'agit de programmer dans des fonctions, des paquets 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")]
376
répondu Joshua Ulrich 2018-09-07 22:18:16

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

> 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
83
répondu Stéphane Laurent 2014-01-15 00:24:29

il y a deux choix évidents: df[,c("A","B","E")] ou

de Joshua Ulrich"
df[,c(1,2,5)]

comme dans

> 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
55
répondu Henry 2012-04-10 06:49:54

vous pouvez également utiliser le paquet sqldf qui effectue des sélections sur les cadres de données R comme:

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

cela donne comme la sortie un cadre de données df1 avec les colonnes: A, B ,E.

10
répondu Aman Burman 2018-04-20 16:57:16

encore une fois en utilisant dplyr, où df1 est votre base de données originale:

df2 <- subset(df1, select = c(1, 2, 5))
8
répondu Richard Ball 2016-06-10 11:34:19

Pour une raison uniquement

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

travaillait pour moi. Tous les syntaxes ci-dessus ont donné "colonnes non définies sélectionnées".

5
répondu so860 2017-10-12 18:12:23

[ et sous-ensemble ne sont pas substituables:

[ retourne 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
répondu fxi 2016-11-09 15:32:24