【问题标题】:Obtain values separated by hyphens获取由连字符分隔的值
【发布时间】:2018-06-18 12:11:45
【问题描述】:

我在数据集中有一堆值,它们的公式类似于 2000-322210/1-10

我想拆分这些,以便在它们自己的行中列出20002001 等和10/110/2 等。

Stata 或 R 中是否有任何命令可以执行此操作?


编辑:

示例数据:

input int SRNo str200 SchemeName str30 CTSNo1 str4 CTSNo2
69 "Khimji Nagar SRA Co-op.Housing Society Ltd." "467" ""
70 "Jai Bhavani CHS Ltd. (Proposed)" "7 (Pt.)" ""
71 "Shivshakti SRA CHS Ltd." "364 ‘A’" ""
72 "Shree Ram CHS Ltd. (Prop.)" "96 (Pt.) -99(Pt.)" ""
end

【问题讨论】:

    标签: r stata hyphen


    【解决方案1】:

    根据您的示例数据(我在其中添加了一些观察结果以使事情更具说明性),您需要以下内容:

    clear
    
    input int SRNo str200 SchemeName str30 CTSNo1 str4 CTSNo2
    69 "Khimji Nagar SRA Co-op.Housing Society Ltd." "467" ""
    70 "Jai Bhavani CHS Ltd. (Proposed)" "7 (Pt.)" ""
    71 "Bhavani Housing" "12(Pt.)-21(Pt.)" ""
    72 "Shivshakti SRA CHS Ltd." "364 ‘A’" ""
    73 "Shree Ram CHS Ltd. (Prop.)" "96 (Pt.)- 99(Pt.)" ""
    74 "Ram CHS Ltd. (Prop.)" "107 (Pt.)- 114 (Pt.)" ""
    end
    
    generate tag = 0
    replace tag = 1 if strmatch(CTSNo1, "*-*")
    
    keep if tag == 1
    generate part1 = regexs(0) if regexm(CTSNo1, "([0-9]+)")
    generate part2 = substr(regexs(0), 2, .) if regexm(CTSNo1, "-.*([0-9])")
    
    local obs = _N
    
    forvalues i = 1 / `obs' {
           local xpa = abs(real(part1[`i']) - real(part2[`i'])) + 1
           expand `xpa' if _n == `i'        
    }
    
    bysort SRNo (CTSNo1): egen interim = seq()
    bysort SRNo (CTSNo1): generate NCTSNo1 = real(part1) + interim - 1
    
    drop tag part1 part2 interim
    order SRNo SchemeName CTSNo1 NCTSNo1 CTSNo2
    

    上面的代码被剪断了,得到了想要的结果:

    list
    
         +-----------------------------------------------------------------------------+
         | SRNo                   SchemeName                 CTSNo1   NCTSNo1   CTSNo2 |
         |-----------------------------------------------------------------------------|
      1. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        12          |
      2. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        13          |
      3. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        14          |
      4. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        15          |
      5. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        16          |
         |-----------------------------------------------------------------------------|
      6. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        17          |
      7. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        18          |
      8. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        19          |
      9. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        20          |
     10. |   71              Bhavani Housing        12(Pt.)-21(Pt.)        21          |
         |-----------------------------------------------------------------------------|
     11. |   73   Shree Ram CHS Ltd. (Prop.)      96 (Pt.)- 99(Pt.)        96          |
     12. |   73   Shree Ram CHS Ltd. (Prop.)      96 (Pt.)- 99(Pt.)        97          |
     13. |   73   Shree Ram CHS Ltd. (Prop.)      96 (Pt.)- 99(Pt.)        98          |
     14. |   73   Shree Ram CHS Ltd. (Prop.)      96 (Pt.)- 99(Pt.)        99          |
     15. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       107          |
         |-----------------------------------------------------------------------------|
     16. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       108          |
     17. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       109          |
     18. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       110          |
     19. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       111          |
     20. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       112          |
         |-----------------------------------------------------------------------------|
     21. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       113          |
     22. |   74         Ram CHS Ltd. (Prop.)   107 (Pt.)- 114 (Pt.)       114          |
         +-----------------------------------------------------------------------------+
    

    编辑:

    我上面的解决方案中的forvalues 循环不是必需的。另一种避免循环观察的方法如下:

    bysort SRNo (CTSNo1): generate xpa = abs(real(part1) - real(part2)) + 1 
    expand xpa
    

    【讨论】:

    • 比你这么多。如果我有最多 54 个 CTSNo 变量(CTSNo1、CTSNo2、... CTSNo54),我是否需要为每个变量单独执行此操作?
    • 是的,但您可以自动化该过程。例如,您可以创建一个循环以将代码运行到 generate 当时的一个变量和 save 新数据集中的新变量。完成此操作后,您可以merge 包含所有变量的所有数据集。
    • 对不起,我对 Stata 还很陌生。您能否提供代码中 CTSNo 的循环示例?
    • 我认为最好为此提出一个新的单独问题,因为这里的帖子已经很长了。
    【解决方案2】:

    假设所有值都像您的示例,并且您的变量是字符串类型:

    . clear
    
    . set obs 1
    number of observations (_N) was 0, now 1
    
    . 
    . generate string1 = "2000-3222"
    
    . generate new_string1 = substr(string1, 1, 4)
    
    . 
    . generate string2 = "10/1-10"
    
    . generate new_string2 = substr(string2, 1, 4)
    
    . 
    . list
    
         +-------------------------------------------+
         |   string1   new_st~1   string2   new_st~2 |
         |-------------------------------------------|
      1. | 2000-3222       2000   10/1-10       10/1 |
         +-------------------------------------------+
    

    如果您只需要原始变量的某个部分,此解决方案很有用。


    编辑:

    使用@Nick 的绝妙建议:

    clear
    set obs 1
    
    generate string1 = "2000-3222"
    generate string2 = "10/1-10"
    
    split string1, parse("-") generate(split_string1)
    split string2, parse("/") generate(split_string2)
    
    list
    
         +-----------------------------------------------------------------+
         |   string1   string2   split~11   split~12   split~21   split~22 |
         |-----------------------------------------------------------------|
      1. | 2000-3222   10/1-10       2000       3222         10       1-10 |
         +-----------------------------------------------------------------+
    

    如您所见,此解决方案将为您提供 string1 的两个变量和 string2 的另外两个变量,每个变量都包含原始变量的两个(单独)部分。

    【讨论】:

    • 另见split
    • @pearlyspencer 谢谢你。我对如何使用 dataex 发布我的代码有点困惑,但我的数据是一个项目列表,每个项目都有一些与之相关的点。我已经在 Excel 中使用逗号分隔的文本将这些分隔到列中。我的最终目标是重塑 long 以将这些列变成行,但现在有些行有一个数字范围,比如 96-99。是否有代码可用于同时扩展由连字符分隔的所有数字和字符串?有很多。抱歉,如果这令人困惑,但感谢您抽出宝贵时间。
    • @BrynneGodfrey 我编辑了我的帖子以包含尼克的更通用的解决方案。很遗憾,没有看到您的数据,我们无法提供进一步的建议。
    • @BrynneGodfrey 当你在 Stata 中运行 dataex 时,它会生成一些输出,然后你可以复制并粘贴到这里。为此,请点击问题下方的“编辑”并粘贴代码。
    • @PearlySpencer 抱歉耽搁了,但我添加了一些示例行。例如,我希望 96-99 是 96、97、98、99,它们都在自己的行中,但用于同一个项目。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2014-03-19
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多