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