首页 > 解决方案 > 为什么命令 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

标签: rsortingdplyrcomparestata

解决方案


我很乐意将什么 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. 变量上的Asort产生所示结果。唯一可能需要解释的细节是空格也是字符,不能被忽略。sort完全是机械的,忘记了意义。特别是,空格" "排在 之前"A"

  3. 如果需要忽略空格的 a,那么最简单的解决方案是在ingsort之前删除空格。sort

如果 R 的工作方式不同,那就这样吧,但这似乎提出了想要什么的问题。


推荐阅读