【问题标题】:Why command gsort doesn't order right?为什么命令 gsort 不正确?
【发布时间】:2020-10-18 22:35:07
【问题描述】:

我正在尝试将命令从 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的结果。

【问题讨论】:

  • 我们需要查看原始数据,而不是图像。我们如何知道Stata中的dest12010变量是字符串变量还是带有值标签的数值变量?根据图像的证据,只有目标列看起来有问题。
  • 感谢您的示例。但是因为uf_amcexist 是常量,因此不相关,并且两个字符串变量彼此相等。因此,您的命令在 Stata 中等同于 sort dest12010,它产生的命令 "LAGO DA PEDRA"' "LAGO DO JUNCO" "LAGO VERDE" "LAGOA GRANDE DO MARANHAO" "LIMA CAMPOS" "LORETO" 对我来说似乎是正确的;唯一需要解释的细节是空格在字母A 之前排序。因此,您的图像所暗示的 Stata 排序顺序是不可重现的。我没有尝试过你的 R 代码,考虑到使用 exampleexaple,它看起来无法重现。
  • 我唯一的猜测是你的真实数据中混合了不同的空格字符,用Stata术语uchar(32)uchar(160)。我认为没有必要重新打开它。
  • 我今天第一条评论有一个虚假的单引号,和我的编辑有关,与Stata的结果无关。 ,
  • gsortsort 在这方面的表现并没有什么不同:如果您要求对字符串进行排序,原则上每个字符都是相关的。如果要忽略空格,则需要对删除它们的变量版本进行排序;或将字符串解析为单词(使用split)并联合对单词进行排序。

标签: r sorting dplyr compare stata


【解决方案1】:

我很乐意将什么 R 留给那些经常使用它的人。

这里的抱怨是,Stata 的行为至少令人费解,最多不正确。鉴于所谓的可重现示例,无法支持此投诉。

首先,让我们清除示例中的一些干扰。这两个字符串变量是相同的,至少当我从这里复制和粘贴它们并比较它们的值时。这两个数值变量在给定的内容中是恒定的,因此它们的排序方式不会影响示例。此外,gsortsort 的包装器,除非减号标记反转默认顺序,否则不会有不同的行为,而默认顺序未针对相关变量指定。最后,还有一个虚假的额外行,从下面的内容中删除。

先编码,再编码结果:

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. 变量上的sort 会产生显示的结果。唯一可能需要解释的细节是空格也是字符,不能被忽略。 sort 完全是机械的,没有意义。特别是,空格" " 排在"A" 之前。

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

如果 R 的工作方式有所不同,那就这样吧,但这似乎会引发人们想要什么的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2020-01-05
    • 1970-01-01
    • 2011-10-26
    • 2013-08-27
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多