楼主: 周正
2046 4

[数据管理求助] Stata如何剔除每个单元格内重复的字符串 [推广有奖]

  • 0关注
  • 0粉丝

大专生

81%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
212 点
帖子
11
精华
0
在线时间
102 小时
注册时间
2010-2-8
最后登录
2023-10-22

楼主
周正 学生认证  发表于 2021-8-3 22:12:14 |AI写论文
7论坛币
数据如下,我想剔除file列每个单元格内的重复字符串,剔除后的结果应该像result列所示那样,请问有什么方法吗?
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input strL(file result)
  4. "CA294156;CA297738B;CA294156;UB101920C"           "CA294156;CA297738B;UB101920C"
  5. "CA298876;CA297738B;CA294156;UB451920C;UB451920C" "CA298876;CA297738B;CA294156;UB451920C"
  6. "CA2865372C;BP20189789;CA2865372C;BP20189789"     "CA2865372C;BP20189789"
  7. "TY345728N;TY345728N"                             "TY345728N"
  8. end
复制代码



关键词:Stata tata 字符串 单元格 generated

沙发
逍遥梦蝶 发表于 2021-8-5 09:09:56
  1. * Import raw example data
  2. cls
  3. clear
  4. input strL(file)
  5. "CA294156;CA297738B;CA294156;UB101920C"           
  6. "CA298876;CA297738B;CA294156;UB451920C;UB451920C"
  7. "CA2865372C;BP20189789;CA2865372C;BP20189789"     
  8. "TY345728N;TY345728N"                             
  9. end

  10. list

  11. *- Split long strings into columns
  12.         split file, parse(";") gen(unit)
  13.        
  14. *- Reshape to long data structure
  15.         gen i = _n
  16.         reshape long unit, i(i) j(j)

  17. *- Drop repeated character units       
  18.         drop if missing(unit)
  19.         drop j
  20.         duplicates drop
  21.        
  22. *- Reshape to wide data structure
  23.         bysort i: gen j = _n
  24.         reshape wide unit, i(i) j(j)

  25. *- Add semicolon to each character units
  26.         foreach v of varlist unit* {       
  27.                 replace `v' = `v' + ";" if !missing(`v')
  28.         }
  29.        
  30. *- Put all character units together by row and remove the last semicolon
  31.         egen result = concat(unit*)
  32.         replace result = substr(result, 1, length(result)-1)
  33.        
  34.         keep file result // Get what you want
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
zdlspace 学生认证  发表于 2021-8-5 17:35:52
我也写一个简单的循环来实现吧,正好熟悉一下continue的使用。
  1. split file,parse(";")

  2. forval i=1/`r(nvars)' {
  3.         forval j=1/`r(nvars)' {
  4.                 if `j'<=`i'{
  5.                         continue
  6.                 }
  7.                 replace file`j'="" if file`i'==file`j'
  8.         }       
  9. }

  10. foreach v of varlist file? {
  11.         replace `v'=`v'+";" if !mi(`v')
  12. }

  13. egen result=concat(file?)
  14. replace result=substr(result,1,strlen(result)-1)
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

板凳
01zhouxuemei 学生认证  发表于 2021-10-8 11:02:22
duplicate drop命令不行吗?

报纸
pengxhan 发表于 2021-10-9 14:23:46
我也来个练练手
split file,p(;)
drop file
sxpose,clear
forvalues i=1/4{
levelsof _var`i', local(mylev) clean
gen  x`i'="`mylev'"
}
keep x1-x4
duplicates drop
sxpose,clear

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-7 04:49