#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
andexaple
.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 |
--------------------------------------------------
Ключевые моменты:
-
assert
Оператор проверяет, что две строковые переменные идентичны. Если это не удалось, скрипт остановится. Если утверждение верно, все продолжается. -
A
sort
в переменной дает показанный результат. Единственная деталь, которая может потребовать объяснения, это то, что пробелы тоже являются символами и не игнорируются.sort
является полностью механическим и не имеет значения. В частности, пробелы" "
сортируются раньше"A"
. -
Если требуется a
sort
, который игнорирует пробелы, то самое простое решение — удалить пробелы передsort
вводом.
Если R работает по-другому, пусть будет так, но это, похоже, поднимает вопрос о том, что требуется.