假设我有这些数据:
clear all
set obs 2
gen title = "dog - cat - horse" in 1
replace title = "chicken - frog - ladybug" in 2
tempfile data
save `data'
我可以将它们分为三个部分:
use `data', clear
split title, p(" - ")
我可以将它们分成两部分,丢弃第三部分:
use `data', clear
split title, p(" - ") limit(2)
是否有现成的解决方案可以仅拆分为两部分,但将第一个拆分字符(在本例中为破折号)之后的所有内容分组到第二个变量中?在 R 中,我将使用
separate
和 extra="merge"
选项(请参阅 tidyr 仅分离前 n 个实例)。
换句话说,对于第一行,我希望第一个观察值的
title1
为 dog
,而 title2
为 cat - horse
。
我意识到使用自定义代码可以实现这一点(请参阅Stata 将字符串拆分为多个部分),但我希望有一个类似于 Stata 的
split
/R 的 separate
的简单命令来实现我的目标。
目前官方
split
命令中没有此选项。 (全面披露:我是前一作者。)
您可以编写自己的命令。这需要更多的通用性和更多的错误检查,但它可以满足您对数据示例的需求。细节:是否需要修剪空间?
clear all
set obs 2
gen title = "dog - cat - horse" in 1
replace title = "chicken - frog - ladybug" in 2
gen title1 = trim(substr(title, 1, strpos(title, "-") - 1))
gen title2 = trim(substr(title, strpos(title, "-") + 1, .))
program split2
syntax varname(string), parse(str) [suffixes(numlist int min=2 max=2)]
if "`suffixes'" == "" local suffixes "1 2"
tokenize "`suffixes'"
gen `varlist'`1' = trim(substr(`varlist', 1, strpos(`varlist', "`parse'") - 1))
gen `varlist'`2' = trim(substr(`varlist', strpos(`varlist', "`parse'") + strlen("`parse'"), .))
end
split2 title, parse("-") suffixes(3 4)
list
+--------------------------------------------------------------------------------+
| title title1 title2 title3 title4 |
|--------------------------------------------------------------------------------|
1. | dog - cat - horse dog cat - horse dog cat - horse |
2. | chicken - frog - ladybug chicken frog - ladybug chicken frog - ladybug |
+--------------------------------------------------------------------------------+