Как упорядочить фрейм данных, используя строковый вектор с именами упорядочиваемых столбцов?

#r #list #loops #dataframe

#r #Список #циклы #фрейм данных

Вопрос:

Предположим, что данные выглядят следующим образом:

 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
  

Я пытаюсь изменить порядок на основе X1 и ACCT_ID.

 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
  

Но когда я пытаюсь сделать это при заполнении из списка, я получаю только первую строку, прочитанную в возвращенном:

   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
  

Строка ID_OUT не разрешена должным образом?

Комментарии:

1. Спасибо @Marcello (пользователь: 5579644) за предположение, что это не дубликат, и ему нужен отдельный вопрос и ответ.

Ответ №1:

Вы могли бы сделать это с помощью get :

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

Вы не должны объединять имена столбцов , как вы это делали в ID_OUT . Вместо этого вы можете поместить нужные имена столбцов в вектор, а затем применить get его.

Ответ №2:

Я нашел один ответ, который, кажется, работает хорошо (хотя мне нужно знать, сколько столбцов указано в списке идентификаторов, и чтобы сделать его более адаптируемым, я в итоге собрал пару быстрых операторов if вместе).

 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]]), ]
}
.
.
.