Description
split 使用一个或多个解析字符串(默认情况下为空格)将字符串变量 strvar 的内容拆分为一个或多个部分,以便生成新的字符串变量。 因此,拆分对于分离“字”或字符串变量的其他部分很有用。 strvar 本身没有修改。
快速入门
为 v 的每个单词创建变量v#,用空格分隔
split v
同上所述,但在逗号上分成单词或短语并生成变量 newv#
split v, parse(,) generate(newv)
同上所述,但不要修剪前导或尾随空格
split v, parse(,) generate(newv) notrim
无论可能的新变量数量是多少,都只创建newv1,newv2和newv3
split v, generate(newv) limit(3)
同上所述,并尽可能转换为数字类型
split v, generate(newv) limit(3) destring
语法
split strvar [if] [in] [, options]
options 选择项
generate(stub) :用 stub 开始新的变量名; 默认是strvar。
parse(parse_strings):解析指定的字符串; default是解析空格。
limit(#) :最多创建#new变量
notrim :不修剪原始变量的前导或尾随空格。
destring:将 destring 应用于新的字符串变量,尽可能用数字变量替换初始字符串变量
ignore("chars"):删除指定的非数字字符强制将非数字字符串转换为缺失值。
float: 生成数值变量为float类型。
percent :将百分比变量转换为小数形式。
Options 选择项详细介绍
generate(stub) 指定新变量名的起始字符,以便生成新变量 stub1 ,stub2 等。 stub 默认为 strvar 。
parse(parse strings) 指定解析使用一个或多个解析字符串,而不是使用空格。 最常见的是,将指定一个标点字符串。 例如,如果指定了parse(,),则“1,2,3”被分成“1”,“2”和“3”。
您还可以指定1)两个或多个字符串,它们是“单词”的替代分隔符和2)由两个或多个字符组成的字符串。 替代字符串应以空格分隔。
包含空格的字符串应该用“”绑定。 因此,如果指定了解析(,“ ”),则“1,2 3”也被分成“1”,“2”和“3”。 特别注意解析(a b)和解析(ab)之间的区别:第一个,a和b都可以作为分隔符,而对于第二个,只有字符串ab是可接受的。
limit(#) 您还可以指定1)两个或多个字符串,它们是“单词”的替代分隔符和2)由两个或多个字符组成的字符串。 替代字符串应以空格分隔
notrim 指定在解析之前不对前导和尾随空格修剪原始字符串变量。
notrim 与空格上的解析不兼容,因为后者意味着要丢弃字符串中的空格。 您可以指定解析字符,或者默认情况下允许修剪。
destring: 将destring应用于新的字符串变量,尽可能用数字变量替换最初作为字符串创建的变量See [D] destring。
ignore(), force, float, percent; see [D] destring.
备注
split用于将字符串变量拆分为两个或多个组件部分,例如“words”。 您可能需要更正错误,或者字符串变量可能是您的真正复合
希望在做更多分析之前进行细分。
在给定一个或多个分隔符的情况下,split 应用的基本步骤是在字符串中查找这些分隔符,然后生成一个或多个新的字符串变量,每个变量都包含原始的一部分。 分隔符可以是例如空格或其他标点符号,但它们又可以是包含多个字符的字符串。 默认分隔符是空格。
用于细分字符串变量的键字符串函数,实际上通常是字符串,是strpos(),它查找分隔符的位置,substr(),它提取字符串的一部分。 (参见[FN]字符串函数。)split 是基于这些函数的使用。
如果没有通过拆分分隔符来定义问题,则可能需要直接使用substr()。 假设您有一个字符串变量 date ,其中包含“21011952”形式的日期,以便最后四个字符定义一年。 该字符串不包含分隔符。 要提取年份,您将使用substr(date,-4,4)。 再次假设过去12个月中每个女性的产科病史都是由含有“nppppppppppbn”等值的str12变量记录的,其中p,b和n表示怀孕,分娩和非怀孕的月份。 再一次,没有分隔符,所以你可以使用 substr()来细分字符串。
split会丢弃分隔符,因为它假定分隔符与进一步分析无关,或者您可以随意恢复它们。如果这不是您想要的,您可以使用 substr() (和
可能是查找字符串首次出现的位置())。
最后,在我们转向示例之前,将 split 与 egen 函数 ends()进行比较,它生成字符串的头部,尾部或最后部分。 与所有egen函数一样,此函数仅生成一个新变量。 相反,split 作为一个命令的结果通常会产生几个新变量。 有关更多详细信息和讨论,包括对识别个人姓名的特殊问题的评论, see [D] egen.
当 Stata 的输入以某种方式误读为一个字符串变量时,split可能很有用。 如果您使用剪贴板复制并粘贴到数据编辑器中,例如,在Windows下,但数据是以空格分隔的,您认为单独的变量将被组合,因为数据编辑器需要逗号或制表符分隔的数据。 如果复合变量的某些部分应该是数字字符放入数值变量,你可以同时使用 destring ; 见[D] destring。
split var1, destring
这里没有指定generate()选项,因此新变量将具有名称 var11 ,var12 等。 您现在可能希望使用重命名来生成更具信息性的变量名称。 See[D] rename.
您还可以使用拆分来细分真正的复合材料。 例如,电子邮件地址(例如 tech-support@stata.com)可能会拆分为“@”:
split address, p(@)
此序列产生两个新变量:address1,包含“@”之前的电子邮件地址的一部分,例如“tech-support”,以及包含“@”之后的部分的 address2,例如 “stata.com” 。 分隔符本身“@”被丢弃。 由于未指定generate(),因此名称地址在命名新变量时用作存根。 split 显示创建的新变量的名称,因此您可以快速查看创建的数字是否符合您的期望。
如果个人的详细信息没有意义,而您只想要机器名称
egen machinename = ends(address), tail p(@)
or
generate machinename = substr(address, strpos(address,"@") + 1,.)
would be more direct.
接下来假设一个字符串变量包含应该分为原告和被告变量的法律案件的名称。 分隔符可以是 “V”,“V”,“VS”和“VS.”。(我们假设使用大写和小写的任何不一致都由字符串函数 strupper()处理; 请参阅[FN]字符串函数。)特别注意我们的前导和尾随空格 分隔符的详细说明:第一个分隔符是“V”,例如,不是“V”,它会错误地将“GOLIATH V DAVID”分成“GOLIATH”,“DA”和“ID”。 给出了替代分离器作为parse()的参数:
split case, p(" V " " V. " " VS " " VS. ")
再次使用变量的默认命名并调用分隔符被丢弃,我们期望新变量case1和case2,而不创建case3或其他新变量。 每当找不到指定的分隔符时,case2将具有空值,因此我们可以检查:
list case if case2 == ""
假设一个字符串变量包含由制表符分隔的字段。 例如,导入分隔的选项卡保持不变。 知道选项卡是char(9),我们可以输入
split data, p(‘=char(9)’) destring
p(char(9))不起作用。 parse()的参数是字面意思,但是动态函数的评估可以作为宏替换的一部分。
最后,假设一个字符串变量包含在括号中绑定的子字符串,如(1 2 3)(4 5 6)。例如,。分割数据,p (“)”)
split data, p(")")
foreach v in ‘r(varlist)’ {
replace ‘v’ = ‘v’ + ")"
}
Stored results
split stores the following in r():
Scalars
r(nvars) number of new variables created
r(varlist) names of the newly created variables
例子
假设输入在某种程度上被误读为一个字符串变量,例如,当您复制并粘贴到数据编辑器中时,数据是以空格分隔的:
split var1, destring
电子邮件地址拆分为“@”:
split address, p(@)
假设一个字符串变量包含法律案件的名称,应将其分成原告和被告的变量。 分隔符可以是“ V ”,“V”,“VS”和“VS.”。 特别注意我们的分隔符细节中的前导和尾随空格:第一个分隔符是“ V ”,例如,不是“V”,它会错误地将“GOLIATH V DAVID”分成“GOLIATH”,“DA”和“ID” ”。 替代分隔符作为parse()的参数给出:
split case, p(" V " " V. " " VS " " VS. ")
问题的迹象是创建两个以上的变量和任何具有空值的变量,因此请检查:
list case if case2 == ""
假设字符串变量包含由制表符分隔的字段。 例如,导入分隔的选项卡保持不变。 知道选项卡是char(9),我们可以输入
split data, p(`=char(9)') destring
p(char(9))不起作用。 parse()的参数是字面意思,但是动态函数的评估可以作为宏替换的一部分。
假设一个字符串变量包含括在括号中的子串,例如(1 2 3)(4 5 6)。 在这里,我们可以拆分右括号,如果需要,可以在之后替换它们。 例如,
split data, p(")")
foreach v in `r(varlist)' {
replace `v' = `v' + ")"
}
例子 1
webuse splitxmpl,clear
list
将 var1 拆分为两个字符串变量,基于“ ”(空格)作为解析字符
split var1
list
删除新创建的变量 var11 和var12
drop var11 var12
将 var1 拆分为两个变量,基于“ ”作为解析字符,并将变量命名为 geog1和 geog2
split var1, gen(geog)
list var1 geog*
例子2
webuse splitxmpl2, clear
list
使用逗号作为解析字符将 var1 拆分为两个变量,并将变量命名为geog1 和 geog2
split var1, parse(,) gen(geog)
list var1 geog*
例子3
webuse splitxmpl3, clear
list
使用逗号后跟空格和空格作为解析字符将日期拆分为变量,并使用ndate 作为新变量名称的前缀
split date, parse(", "" ") gen(ndate)
list
例子4
webuse splitxmpl4, clear
list
使用逗号作为解析字符将x拆分为变量,并尝试用数字变量替换新的字符串变量
split x, parse(,) destring
list
describe
网友评论