R сортирует вектор по своему усмотрению
df.sorted <- c("binned_walker1_1.grd", "binned_walker1_2.grd", "binned_walker1_3.grd",
"binned_walker1_4.grd", "binned_walker1_5.grd", "binned_walker1_6.grd",
"binned_walker2_1.grd", "binned_walker2_2.grd", "binned_walker3_1.grd",
"binned_walker3_2.grd", "binned_walker3_3.grd", "binned_walker3_4.grd",
"binned_walker3_5.grd", "binned_walker4_1.grd", "binned_walker4_2.grd",
"binned_walker4_3.grd", "binned_walker4_4.grd", "binned_walker4_5.grd",
"binned_walker5_1.grd", "binned_walker5_2.grd", "binned_walker5_3.grd",
"binned_walker5_4.grd", "binned_walker5_5.grd", "binned_walker5_6.grd",
"binned_walker6_1.grd", "binned_walker7_1.grd", "binned_walker7_2.grd",
"binned_walker7_3.grd", "binned_walker7_4.grd", "binned_walker7_5.grd",
"binned_walker8_1.grd", "binned_walker8_2.grd", "binned_walker9_1.grd",
"binned_walker9_2.grd", "binned_walker9_3.grd", "binned_walker9_4.grd",
"binned_walker10_1.grd", "binned_walker10_2.grd", "binned_walker10_3.grd")
Можно было бы ожидать, что порядок этого вектора будет 1:length(df.sorted)
, но, похоже, это не так. Похоже, что R внутренне сортирует вектор в соответствии с его логикой, но очень старается отобразить его так, как он был создан (и это видно в выводе).
order(df.sorted)
[1] 37 38 39 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[26] 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Есть ли способ "сбросить" порядок до 1:length(df.sorted)
? Таким образом, порядок и выходные данные вектора будут синхронизированы.
Ответы
Ответ 1
построить его как упорядоченный множитель:
> df.new <- ordered(df.sorted,levels=df.sorted)
> order(df.new)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
ИЗМЕНИТЬ:
После комментария @DWins, я хочу добавить, что даже не важно сделать его упорядоченным фактором, достаточно простого фактора, если вы дадите правильный порядок уровней:
> df.new2 <- factor(df.sorted,levels=df.sorted)
> order(df.new)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
Разница будет заметна при использовании этих факторов в регрессионном анализе, с ними можно обращаться по-разному. Преимущество упорядоченных факторов заключается в том, что они позволяют использовать операторы сравнения как < и > . Это делает жизнь намного проще.
> df.new2[5] < df.new2[10]
[1] NA
Warning message:
In Ops.factor(df.new[5], df.new[10]) : < not meaningful for factors
> df.new[5] < df.new[10]
[1] TRUE
Ответ 2
Используйте функции mixedsort
(или) mixedorder
в пакетах gtools:
require(gtools)
mixedorder(df.sorted)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[28] 28 29 30 31 32 33 34 35 36 37 38 39
Ответ 3
Разве это не то же самое, что вы получаете со всеми лексикографическими шортами (например, ls
в каталогах), где walker10_foo sorts
выше, чем walker1_foo
?
Самый простой способ в моей книге - использовать последовательное количество цифр, то есть я бы изменился на binned_walker01_1.grd
и т.д., вставив 0 для однозначных счетчиков.
Ответ 4
В ответ на комментарий Dwin к Dirk ответ: данные всегда замазку в ваших руках. "Это R. Нет, если. Только так". - Саймон Бломберг
Вы можете добавить 0
так:
df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted)
Если вам нужно добавить 00
, вы сделаете это следующим образом:
df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted)
df.sorted <- gsub("(walker)([[:digit:]]{2}_)", "\\10\\2", df.sorted)
... и т.д.