首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取由连字符分隔的值

获取由连字符分隔的值
EN

Stack Overflow用户
提问于 2018-06-18 12:11:45
回答 2查看 79关注 0票数 0

我在dataset中有一组值,这些值都是由2000-322210/1-10组成的。

我想将它们分开,以便它列出20002001等以及10/110/2等,它们都在各自的行中。

在Stata或R中有什么命令可以这样做吗?

编辑:

示例数据:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-18 16:31:14

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

代码语言:javascript
复制
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

上面的代码片段产生了所需的结果:

代码语言:javascript
复制
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循环是不必要的。另一种避免重复观察的方法是:

代码语言:javascript
复制
bysort SRNo (CTSNo1): generate xpa = abs(real(part1) - real(part2)) + 1 
expand xpa
票数 1
EN

Stack Overflow用户

发布于 2018-06-18 12:24:39

假设所有值都类似于您的示例,并且变量的类型为string:

代码语言:javascript
复制
. 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的优秀建议:

代码语言:javascript
复制
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提供另外两个变量,每个变量包含原始变量的两个(单独)部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50909267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档