楼主: undertone
8338 13

[其他] [求教] 请问如何便捷地同时删除矩阵中的第n行和第n列? [推广有奖]

  • 0关注
  • 0粉丝

已卖:75份资源

本科生

94%

还不是VIP/贵宾

-

威望
0
论坛币
936 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
904 点
帖子
55
精华
0
在线时间
169 小时
注册时间
2005-11-1
最后登录
2024-7-23

楼主
undertone 发表于 2011-1-26 22:49:49 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
假如Stata的.dta文件中是一个7890×7890的矩阵。其每一列以“v”加上去前零的ID号形成的变量名来标识。比如“0102”行对应的列的变量名就是“v102”。


  ID           v101      v102     ……      v7890
0101          ***          ***        ……       ***
0102          ***          ***        ……       ***

……

7890          ***          ***        ……       ***


现在需要删除其中的“0103”行和“v103”列、“0112”行和“v112”列、……“7089”行和“v7089”列,等等。

请问有没有什么命令可以实现?或者如何通过建立关联,在删除行的同时也删除相应的列?

谢谢啦!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:DTA文件 请问有没有 Stata tata 有没有 如何

沙发
sungmoo 发表于 2011-1-27 00:15:38
undertone 发表于 2011-1-26 22:49
ID             v101       v102      ……      v7890
0101          ***          ***        ……       ***
0102          ***          ***        ……       ***

……

7890          ***          ***        ……       ***
现在需要删除其中的“0103”行和“v103”列、“0112”行和“v112”列、……“7089”行和“v7089”列,等等。
sort ID
g x=0
foreach i of num 103 112 … 7089{
replace x=. in `i'
drop v`i'
}
drop if x==.
drop x

藤椅
sungmoo 发表于 2011-1-27 00:53:46
由于stata的矩阵元素不能是字符,若数据库含字符型变量,只能按数据库操作。

板凳
undertone 发表于 2011-1-27 09:57:35
sungmoo 发表于 2011-1-27 00:15

g x=0
foreach i of num 3 12 … 89 … 108{
replace x=. in `i'
foreach v of var _all{
if real(substr("`v'",2,.))==`i' drop `v'
}
}
drop if x==.
drop x
Re:

谢谢回复。

抱歉,拿到的数据和开始描述的有点不一样。差别在于ID的设定及其对应列变量的命名。我已经把上面的描述更新了。

我试用过


forval id = 102 112 … 7089 {
    drop v`id'
}


但是被报是invalid syntax。

:(

报纸
sungmoo 发表于 2011-1-27 10:01:59
undertone 发表于 2011-1-27 09:57
forval id = 102 112 … 7089 {
    drop v`id'
}
foreach i of num 102 112 … 7089{
drop v`i'
}
已有 1 人评分论坛币 收起 理由
dxystata + 5 好的意见建议

总评分: 论坛币 + 5   查看全部评分

地板
sungmoo 发表于 2011-1-27 10:04:00
undertone 发表于 2011-1-27 09:57
forval id = 102 112 … 7089 {
    drop v`id'
}
上述写法需要注意:变量名v102、v112等中间没有"0"补位。

7
undertone 发表于 2011-1-27 10:38:06
sungmoo 发表于 2011-1-27 10:04
undertone 发表于 2011-1-27 09:57
forval id = 102 112 … 7089 {
    drop v`id'
}
上述写法需要注意:变量名v102、v112等中间没有"0"补位。
Re:

嗯。这个注意到了。

试了下


foreach id of num 102 112 … 7089 {
    drop v`id'
}


好像奏效。谢谢!

现在我能不能再把故事讲得实际一点啊?

实际情况是,这个矩阵文件是经过了merge操作以后的保存的。也就是说,可以通过_merge==2找到上面提及需要删除的行(“0102”行、“0112”行、……“7089”行,等等)。

现在的问题,要删除的列有2256之多,能不能在上面的foreach之外再套一个循环,用以索引到2256个像“102”、“112”……“7089”这样的数字啊?

8
undertone 发表于 2011-1-27 10:52:16
sungmoo 发表于 2011-1-27 10:01
undertone 发表于 2011-1-27 09:57
forval id = 102 112 … 7089 {
    drop v`id'
}
foreach i of num 102 112 … 7089{
    drop v`i'
}
Re:

想学习了解一下为什么上述的forval命令出错呢?

9
sungmoo 发表于 2011-1-27 12:41:41
undertone 发表于 2011-1-27 10:52 想学习了解一下为什么上述的forval命令出错呢?
这不符合forv的语法。

10
sungmoo 发表于 2011-1-27 12:49:36
undertone 发表于 2011-1-27 10:38
foreach id of num 102 112 … 7089 {
    drop v`id'
}
好像奏效。谢谢!
这个可以删除变量v0102吗?

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

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