R сортирует вектор по своему усмотрению - PullRequest
14 голосов
/ 26 ноября 2010
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)? Таким образом, порядок и выходные данные вектора будут синхронизированы.

Ответы [ 4 ]

15 голосов
/ 26 ноября 2010

Используйте функции 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
12 голосов
/ 26 ноября 2010

построить его как упорядоченный множитель:

> 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
10 голосов
/ 26 ноября 2010

Разве это не то же самое, что вы получаете со всеми лексикографическими шортами (например, ls в каталогах), где walker10_foo sorts выше walker1_foo?

Самый простой способ, в моей книге, состоит в том, чтобы использовать постоянное количество цифр, то есть я бы изменил на binned_walker01_1.grd и т. д., вставляя 0 для однозначного числа.

7 голосов
/ 27 ноября 2010

В ответ на комментарий Двина к ответу Дирка: данные всегда замазаны в ваших руках. «Это Р. Нет, если. Только как». - Саймон Бломберг

Вы можете добавить 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)

... и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...