Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stata 从连接的字符串中删除尾随标点_Stata - Fatal编程技术网

Stata 从连接的字符串中删除尾随标点

Stata 从连接的字符串中删除尾随标点,stata,Stata,我有几个字符串变量,我想在一个变量中转换成逗号分隔的字符串。当我将egen-concat与punct(“,”选项一起使用时,如果条目中缺少相关行,则会得到尾随逗号,这在我的数据中很常见 我想我可以用regexm()和for循环删除尾随的逗号,但我的串联字符串变量没有改变 我如何让这个正则表达式在Stata匹配?(或者我完全走错了路。) 这规定: . list +-------------------------------------------------------------+

我有几个字符串变量,我想在一个变量中转换成逗号分隔的字符串。当我将
egen-concat
punct(“,”
选项一起使用时,如果条目中缺少相关行,则会得到尾随逗号,这在我的数据中很常见

我想我可以用
regexm()
和for循环删除尾随的逗号,但我的串联字符串变量没有改变

我如何让这个正则表达式在Stata匹配?(或者我完全走错了路。)

这规定:

. list

     +-------------------------------------------------------------+
     | name1   name2   name3              names             names2 |
     |-------------------------------------------------------------|
  1. |   Tom    Dick   Harry   Tom, Dick, Harry   Tom, Dick, Harry |
  2. |   Tom                             Tom, ,             Tom, , |
     +-------------------------------------------------------------+

像这样的东西对你的数据有用吗

clear

input str5 name1    str5 name2  str5 name3 str5 name4
Tom     Dick    Harry Hank
Tom     ""      ""  Hank
Tom     ""    Harry "" Hank
Tom     ""    "" ""
end  

list

egen names = concat(name*), punct(" ")
gen names2 = subinstr(itrim(names), " ", ", ", .)

list

如果字符串变量有空格,例如“Hank和Gloria”,则将失败。

egen
concat()
函数只实现一个循环。您可以自己编写:

gen names = name1 

forval j = 2/4 { 
    replace names = cond(mi(names), name`j', names + "," + name`j') if !mi(name`j')
} 

对于空格来说,这是失败的,但是我非常喜欢使用一个标点符号然后替换另一个标点符号(比如说
,然后替换
)。有了这个设置,我需要对多个
|
进行正则化。谢谢你的建议,但我认为尼克的基本解决方案是最好的。谢谢你,尼克。我想基本面总是赢的。我需要
=
后面的第一个
名称吗?
gen names = name1 

forval j = 2/4 { 
    replace names = cond(mi(names), name`j', names + "," + name`j') if !mi(name`j')
}