Почему команда gsort не упорядочивается правильно?

#r #sorting #dplyr #compare #stata

#r #сортировка #dplyr #Сравнить #stata

Вопрос:

Я пытаюсь перевести команду из Stata в R, но, сравнивая результат между двумя командами, я понял, что некоторые строки не в идеальном порядке. Кто-нибудь знает, как сделать две команды совершенно одинаковыми?

 Stata code with reproducible example:
clear
input str32 dest12010 byte uf_amc exist_d2010 str32 final_name 
dest12010 uf_amc exist_d2010 final_name
"LAGO DA PEDRA" 3 1 "LAGO DA PEDRA"
"LAGOA GRANDE DO MARANHAO" 3 1 "LAGOA GRANDE DO MARANHAO" 
"LAGO DO JUNCO" 3 1 "LAGO DO JUNCO" 
"LAGO VERDE" 3 1 "LAGO VERDE" 
"LIMA CAMPOS" 3 1 "LIMA CAMPOS" 
"LORETO" 3 1 "LORETO"
end

gsort uf_amc dest12010 -exist_d2010 final_name
  
 R code with reproducible example:
example <- structure(list(dest12010 = c("LAGO DA PEDRA", "LAGOA GRANDE DO MARANHAO", 
"LAGO DO JUNCO", "LAGO VERDE", "LIMA CAMPOS", "LORETO"), uf_amc = c(3L, 
3L, 3L, 3L, 3L, 3L), exist_d2010 = c(1L, 1L, 1L, 1L, 1L, 1L), 
    final_name = c("LAGO DA PEDRA", "LAGOA GRANDE DO MARANHAO", 
    "LAGO DO JUNCO", "LAGO VERDE", "LIMA CAMPOS", "LORETO")), row.names = c(NA, 
-6L), class = c("data.table", "data.frame"))

dplyr::arrange(example, uf_amc,dest12010,(exist_d2010),final_name)
  

Вывод

Вывод

Столбцы с «_s» в конце являются результатом использования Stata gsort , и без этой детали это результат R arrange .

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

1. Нам нужно видеть необработанные данные, а не изображение. Как мы узнаем, является ли dest12010 переменная в Stata строковой переменной или числовой переменной с метками значений? На примере изображения проблемными выглядят только столбцы назначения.

2. Спасибо за ваш пример. Но в этом uf_amc и exist являются постоянными и, следовательно, не имеют значения, а две строковые переменные равны друг другу. Таким образом, ваша команда эквивалентна по статусу sort dest12010 , что дает порядок "LAGO DA PEDRA"' "LAGO DO JUNCO" "LAGO VERDE" "LAGOA GRANDE DO MARANHAO" "LIMA CAMPOS" "LORETO" , который мне кажется правильным; единственная деталь, которую нужно объяснить, это то, что пробелы сортируются перед буквой A . Таким образом, порядок сортировки Stata, подразумеваемый вашим изображением, не воспроизводим. Я не пробовал ваш R-код, который выглядит невоспроизводимым для меня, учитывая использование example and exaple .

3. Единственное предположение, которое у меня есть, это то, что в ваших реальных данных есть сочетание разных пробелов, в терминах Stata uchar(32) и uchar(160) . Я не вижу причин для повторного открытия этого.

4. В моем первом сегодняшнем комментарии есть ложная одинарная кавычка, которая связана с моим редактированием и не имеет ничего общего с результатами Stata. ,

5. gsort и sort не ведите себя по-другому в этом отношении: если вы просите отсортировать строку, в принципе, каждый символ имеет значение. Если вы хотите, чтобы пробелы игнорировались, вам нужно выполнить сортировку по версии переменной, в которой они удалены; или разобрать строку на слова (используя split ) и отсортировать по словам совместно.

Ответ №1:

Какой R я с радостью оставляю тем, кто использует его регулярно.

Жалоба здесь заключается в том, что Stata ведет себя, по крайней мере, загадочным образом, и в лучшем случае неправильно. Эта жалоба не может быть поддержана, учитывая предположительно воспроизводимый пример.

Во-первых, давайте уберем некоторые отвлекающие факторы в примере. Две строковые переменные идентичны, по крайней мере, когда я копирую и вставляю их отсюда и сравниваю их значения. Две числовые переменные являются постоянными в том, что задано, поэтому способ их сортировки не влияет на пример. Кроме того, gsort является оболочкой для sort и не ведет себя по-другому, если знак минус не указывает на изменение порядка по умолчанию, который не указан для рассматриваемой переменной. Наконец, есть ложная дополнительная строка, которая отредактирована из того, что ниже.

Сначала код, затем код с результатами:

 clear
input str32 dest12010 byte uf_amc exist_d2010 str32 final_name 
"LAGO DA PEDRA" 3 1 "LAGO DA PEDRA"
"LAGOA GRANDE DO MARANHAO" 3 1 "LAGOA GRANDE DO MARANHAO" 
"LAGO DO JUNCO" 3 1 "LAGO DO JUNCO" 
"LAGO VERDE" 3 1 "LAGO VERDE" 
"LIMA CAMPOS" 3 1 "LIMA CAMPOS" 
"LORETO" 3 1 "LORETO"
end

assert dest12010 == final_name 
keep dest12010 
sort dest12010 

list , sep(0)

gen dest12010_2 = subinstr(dest12010, " ", "", .) 

sort dest12010_2 

list , sep(0)
  

Результаты

 . assert dest12010 == final_name 

. keep dest12010 

. sort dest12010 

. list , sep(0)

      -------------------------- 
     |                dest12010 |
     |--------------------------|
  1. |            LAGO DA PEDRA |
  2. |            LAGO DO JUNCO |
  3. |               LAGO VERDE |
  4. | LAGOA GRANDE DO MARANHAO |
  5. |              LIMA CAMPOS |
  6. |                   LORETO |
      -------------------------- 

. gen dest12010_2 = subinstr(dest12010, " ", "", .) 

. sort dest12010_2 

. list , sep(0)

      -------------------------------------------------- 
     |                dest12010             dest12010_2 |
     |--------------------------------------------------|
  1. | LAGOA GRANDE DO MARANHAO   LAGOAGRANDEDOMARANHAO |
  2. |            LAGO DA PEDRA             LAGODAPEDRA |
  3. |            LAGO DO JUNCO             LAGODOJUNCO |
  4. |               LAGO VERDE               LAGOVERDE |
  5. |              LIMA CAMPOS              LIMACAMPOS |
  6. |                   LORETO                  LORETO |
      -------------------------------------------------- 
  

Ключевые моменты:

  1. assert Оператор проверяет, что две строковые переменные идентичны. Если это не удалось, скрипт остановится. Если утверждение верно, все продолжается.

  2. A sort в переменной дает показанный результат. Единственная деталь, которая может потребовать объяснения, это то, что пробелы тоже являются символами и не игнорируются. sort является полностью механическим и не имеет значения. В частности, пробелы " " сортируются раньше "A" .

  3. Если требуется a sort , который игнорирует пробелы, то самое простое решение — удалить пробелы перед sort вводом.

Если R работает по-другому, пусть будет так, но это, похоже, поднимает вопрос о том, что требуется.