如何将字符串分成两部分(而不丢弃其他部分)

问题描述 投票:0回答:1

假设我有这些数据:

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
的简单命令来实现我的目标。

string split stata
1个回答
0
投票

目前官方

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 |
     +--------------------------------------------------------------------------------+

© www.soinside.com 2019 - 2024. All rights reserved.