2016-10-12 4 views
0

Lässt die Daten sieht wie folgt annehmen:Wie bestelle ich einen Datenrahmen mit einem String-Vektor mit den Namen der zu bestellenden Spalten?

df3 = data.frame(matrix(rnorm(20), nrow=10)) 
df3$ACCT_ID <- as.numeric(rownames(df3)) 
df3$X3 <- ifelse(df3$X2 < 1,"LOW","HIGH") 

df3 
      X1   X2 ACCT_ID X3 
1 0.8533321 0.73676965  1 LOW 
2 -0.2289266 -0.87010747  2 LOW 
3 -0.7997897 0.49979417  3 LOW 
4 0.5281416 -0.70161594  4 LOW 
5 -0.6246283 0.81879826  5 LOW 
6 0.9939673 -1.20910819  6 LOW 
7 -0.8955201 0.42167923  7 HIGH 
8 1.4404649 0.59220989  8 LOW 
9 -0.8687570 0.09393659  9 LOW 
10 -0.7030129 -0.95184303  10 LOW 

Ich bin neu, um basierend auf X1 und ACCT_ID versuchen.

TEMP_X_DF <- df3[with(df3, order(X1,ACCT_ID)), ] 
TEMP_X_DF 
      X1   X2 ACCT_ID X3 
7 -0.8955201 0.42167923  7 HIGH 
9 -0.8687570 0.09393659  9 LOW 
3 -0.7997897 0.49979417  3 LOW 
10 -0.7030129 -0.95184303  10 LOW 
5 -0.6246283 0.81879826  5 LOW 
2 -0.2289266 -0.87010747  2 LOW 
4 0.5281416 -0.70161594  4 LOW 
1 0.8533321 0.73676965  1 LOW 
6 0.9939673 -1.20910819  6 LOW 
8 1.4404649 0.59220989  8 LOW 

Aber wenn ich versuche, dies zu tun, wenn sie aus einer Liste bevöl Ich werde nur die erste Zeile eingelesen zurückgegeben:

IDS <- c("X1","ACCT_ID") 
    for (id in 1:length(IDS)){ 
    if (id == 1){ 
     ID_OUT <- IDS[id] 
    } 
    else { 
     ID_OUT <- paste(ID_OUT,IDS[id],sep=",") 
    } 
    } 
    TEMP_X_DF <- df3[with(df3, order(ID_OUT)), ] 
    TEMP_X_DF 
     X1  X2 ACCT_ID X3 
1 0.8533321 0.7367696  1 LOW 

Ist die Zeichenfolge ID_OUT nicht richtig lösen?

+0

Dank @Marcello (Benutzer: 5579644) für den Vorschlag, dies ist kein Duplikat und benötigt eine eigene eindeutige Frage und Antwort. – JJFord3

Antwort

2

Sie könnten dies get mit tun:

df3[with(df3, order(get(IDS))), ] 

Sie sollten die Spaltennamen nicht verketten, wie Sie in ID_OUT tat. Stattdessen können Sie die gewünschten Spaltennamen in einen Vektor einfügen und dann get anwenden.

0

Ich fand eine Antwort, die gut zu funktionieren scheint (obwohl ich wissen muss, wie viele Spalten in der IDS-Liste aufgeführt sind und um sie anpassungsfähiger zu machen, habe ich ein paar schnelle if-Anweisungen zusammengefügt).

IDS <- c("X1","ACCT_ID") 
if (length(IDS) == 1){ 
    TEMP_X_DF <- df3[order(df3[,IDS[1]]), ] 
} 
else if (length(IDS) == 2){ 
    TEMP_X_DF <- df3[order(df3[,IDS[1]],df3[,IDS[2]]), ] 
} 
. 
. 
. 
Verwandte Themen