2015-12-12 2 views
0

J'essaie de sous-définir mes données pour supprimer des lignes avec certaines valeurs de certaines variables. Supposons que j'ai une trame de données df avec beaucoup de colonnes et de lignes, je veux supprimer des lignes basées sur les valeurs des variables G1 et G9, et je veux seulement garder des lignes où ces variables prennent des valeurs de 1, 2 ou 3. De cette façon, je vise à sous-ensemble sur les mêmes valeurs à travers plusieurs variables. J'essaye de faire ceci avec quelques lignes de code et d'une manière qui permette des changements rapides aux variables ou aux valeurs que je voudrais employer. Par exemple, en supposant que je commence par trame de données df et que vous souhaitez mettre fin à newdf, ce qui exclut les observations où G1 et G9 ne prennent pas sur des valeurs de 1, 2 ou 3:Sous-maillage efficace sur plusieurs colonnes et lignes

# Naive approach (requires manually changing variables and values in each line of code) 
newdf <- df[which(df$G1 %in% c(1,2,3), ] 
newdf <- df[which(newdf$G9 %in% c(1,2,3), ] 

# Better approach (requires manually changing variables names in each line of code) 
vals <- c(1,2,3) 
newdf <- df[which(df$G1 %in% vals, ] 
newdf <- df[which(newdf$G9 %in% vals, ] 

Si je voulais non seulement sous-ensemble sur G1 et G9 mais de nombreuses variables, cette approche manuelle prendrait du temps à modifier. Je veux simplifier encore plus en consolidant tout le code dans une seule ligne. Je sais que ce qui suit est faux mais je ne suis pas sûr de savoir comment mettre en place une alternative.

newdf <- c(1,2,3) 
newdf <- c(df$G1, df$G9) 
newdf <- df[which(df$vars %in% vals, ] 

Je crois comprendre que je veux utiliser apply() mais je ne sais pas comment.

+0

Veuillez fournir un jeu de données sur lequel travailler. Un MWE (exemple de travail minimum) nous permet de fournir des réponses concises. –

Répondre

1

Vous n'avez pas besoin d'utiliser avec% in%, cela renvoie des valeurs booléennes. Que diriez-vous ci-dessous:

keepies <- (df$G1 %in% vals) & (df$G9 %in% vals) 
newdf <- df[keepies, ] 
+0

Ce n'est pas ce que je cherche, car il nécessite encore beaucoup de code si j'ai un grand nombre de variables (par exemple G1, G2, G3 ... Gn où n est grand). Je cherche plutôt à créer un vecteur de noms de variables: vars <- c ("G1", "G2", "G3", ... "Gn") pour éviter d'avoir autant de code. – user3614648

+1

Que diriez-vous du code ci-dessous. Vous pouvez ajuster pour n'utiliser que les colonnes que vous désirez, mais cela suppose toujours que les mêmes valeurs seront utilisées. 'df [applique (applique (df, 2, fonction (x) x% en% vals), 1, tous),]' – Raad

1

Utilisez data.table

Tout d'abord, faire fondre vos données

library(data.table) 

DT <- melt.data.table(df) 

ensuite divisé en listes

DTLists <- split(DT, list(DT[1:9])) #this is the number of columns that you have. 

Maintenant, vous pouvez utiliser sur les listes en utilisant récursive lapply

DTresult <- lapply(DTLists, function(x) { 
         ... 
         }