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?
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)
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")]
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
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
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.
Où df1 est votre trame de données d'origine:
df2 <- subset(df1, select = c(1, 2, 5))
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".
Vous pouvez utiliser with
:
with(df, data.frame(A, B, E))
[
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"))
)