如何解决为什么命令gsort排序不正确?
我试图将一个命令从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),exist_d2010 = c(1L,1L,1L),final_name = c("LAGO DA PEDRA","LOReto")),row.names = c(NA,-6L),class = c("data.table","data.frame"))
dplyr::arrange(example,uf_amc,dest12010,(exist_d2010),final_name)
结尾处带有“ _s”的列是使用gsort
的Stata的结果,而没有此详细信息,则是R arrange
的结果。
解决方法
我将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
语句检查两个字符串变量是否相同。如果失败,脚本将停止。如果断言正确,则继续进行。 -
变量
sort
产生显示的结果。唯一需要说明的细节是空格也是字符,不能忽略。sort
完全是机械的,并没有意义。特别是,空格" "
在"A"
之前排序。 -
如果需要忽略空格的
sort
,那么最简单的解决方案是在sort
之前删除空格。
如果R的工作原理不同,就这样吧,但这似乎引发了对所需内容的疑问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。