web-dev-qa-db-fra.com

Sous-ensemble de colonnes en fonction de la liste des noms de colonne et placez la colonne devant

J'ai un ensemble de données plus grand suivant le même ordre, une colonne de date unique, des données, une colonne de date unique, une date, etc. J'essaie de sous-définir non seulement la colonne de données par nom mais également la colonne de date unique. Le code ci-dessous sélectionne les colonnes en fonction d'une liste de noms, ce qui fait partie de ce que je veux, mais des idées sur la façon dont je peux récupérer la colonne immédiatement avant la colonne sous-définie également?

Vous cherchez à vous retrouver avec un DF contenant les colonnes Date1, Fire, Date3, Earth (en utilisant uniquement la NameList).

Voici mon code reproductible:

Cnames <- c("Date1","Fire","Date2","Water","Date3","Earth")
MAINDF <- data.frame(replicate(6,runif(120,-0.03,0.03)))
colnames(MAINDF) <- Cnames

NameList <- c("Fire","Earth")

NewDF <- MAINDF[,colnames(MAINDF) %in% NameList] 
12
Trevor Nederlof

Que diriez-vous

NameList <- c("Fire","Earth")

idx <- match(NameList, names(MAINDF))
idx <- sort(c(idx-1, idx))

NewDF <- MAINDF[,idx] 

Ici, nous utilisons match() pour trouver l'index de la colonne souhaitée, puis nous pouvons utiliser la soustraction d'index pour saisir la colonne avant

11
MrFlick

Utilisez which pour obtenir les numéros de colonne à partir des noms, puis c'est juste une arithmétique simple:

col.num <- which(colnames(MAINDF) %in% NameList)
NewDF <- MAINDF[,sort(c(col.num, col.num - 1))]

Produit

         Date1         Fire        Date3        Earth
1 -0.010908003  0.007700453 -0.022778726 -0.016413307
2  0.022300509  0.021341360  0.014204445 -0.004492150
3 -0.021544992  0.014187158 -0.015174048 -0.000495121
4 -0.010600955 -0.006960160 -0.024535954 -0.024210771
5 -0.004694499  0.007198620  0.005543146 -0.021676692
6 -0.010623787  0.015977135 -0.027741109 -0.021102651
...
9
BrodieG