r - 为什么命令 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, 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
。
解决方案
我很乐意将什么 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,那么最简单的解决方案是在ing
sort
之前删除空格。sort
如果 R 的工作方式不同,那就这样吧,但这似乎提出了想要什么的问题。
推荐阅读
- javascript - 批量并行运行 Sql 查询 Promises
- php - 单元测试:将参数发送到端点
- javascript - 代理前端路由到同域下的另一个域
- c++ - 使用通过 Rcpp 暴露给 R 的 Eigen 对象的 C++ 类的最小示例不起作用。我究竟做错了什么?
- c# - 根据其他 dgv 组合框选择填充 datagridview 组合框
- python-3.x - 这个语句中的“and”关键字有什么作用?
- reactjs - 如何自定义日历标题文本格式(Material UI v5 - DatePicker)
- r - R:按小时的子集数据
- sql - 根据列更改值
- java - HTTP 代理 - 上游连接错误或在标头之前断开/重置。重置原因:协议错误