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?
8 réponses
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")]
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
il y a deux choix évidents: df[,c("A","B","E")]
ou
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
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.
encore une fois en utilisant dplyr, où df1 est votre base de données originale:
df2 <- subset(df1, select = c(1, 2, 5))
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".
[
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"))
)