2014-12-18 12 views
9

Ich habe einen größeren Datensatz nach der gleichen Reihenfolge, eine eindeutige Datumsspalte, Daten, eindeutige Datumsspalte, Datum usw. Ich versuche, nicht nur die Untermenge Datenspalte nach Name, aber auch die eindeutige Datumsspalte. Der folgende Code wählt Spalten auf der Basis einer Liste von Namen aus, was ein Teil von dem ist, was ich will, aber irgendwelche Ideen, wie ich die Spalte unmittelbar vor der Teilspalten-Spalte auch abrufen kann?Subset Spalten basierend auf der Liste der Spaltennamen und bringen Sie die Spalte davor

Mit einem DF zu sehen, das Date1, Fire, Date3, Earth-Spalten enthält (nur die NameList verwenden).

Hier ist mein reproduzierbarer Code:

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] 

Antwort

6

Wie wäre es mit

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

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

NewDF <- MAINDF[,idx] 

Hier verwenden wir match() den Index der gewünschten Spalte zu finden, und dann können wir Index Subtraktion greifen die Spalte, bevor es

verwenden
6

Verwenden which die Spaltennummern von den Namen zu bekommen, und es ist dann nur einfache Arithmetik:

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

Produziert

  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 
... 
Verwandte Themen