楼主: benbenbenben
10945 15

[数据管理求助] 关于用foreach合并多个数据file的问题 [推广有奖]

  • 0关注
  • 0粉丝

本科生

25%

还不是VIP/贵宾

-

威望
0
论坛币
20 个
通用积分
0.0014
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
504 点
帖子
42
精华
0
在线时间
78 小时
注册时间
2005-11-10
最后登录
2017-2-13

楼主
benbenbenben 发表于 2014-5-14 22:19:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有12个所含变量和结构都相同的csv file,我想先把.csv转成.dta,然后合并所有的.dta为一个文件,我的coding 如下:
local data: dir "." files "*.csv"
foreach s of local data{
       clear
       insheet using `s',
       gen fileid=" `s' "
       save `s'.dta,replace

}
以上这部分没有问题,可以把所有.csv 转成.dta
以下这部分就不work了,
foreach v of local data{
        append using `v'.dta,force  
}

save final.dta, replace

问题是:最后这个合并在一起的.dta并不是所有.dta合并的结果,而只是和第12个.dta文件完全相同
请高人指点,改了很多次,都无果
二维码

扫码加我 拉你入群

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

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

关键词:foreach Reach file For replace file

沙发
voodoo 发表于 2014-5-14 22:40:35

你假如是逐段执行程序的话,在执行第二段程序时,第一段程序中定义的local data的内容将丢失,也就是说此时local data为""。

试试:
  1. clear
  2. local data: dir "." files "*.csv"
  3. foreach v of local data {
  4.          append using `v'.dta, force
  5. }
  6. save final.dta, replace
复制代码

由于append命令接受多个文档,若你文件名中不包含空格,也可以试试:
  1. clear
  2. local data: dir "." files "*.csv.dta"
  3. append using `data', force
  4. save final.dta, replace
复制代码
巫毒上传,必属佳品!
坛友下载,三思后行!

藤椅
kerrydu 发表于 2014-5-14 23:03:36
问题在于后面的local没有定义

clear
local data: dir "." files "*.dta"
foreach v of local data{
        append using `v'.dta,force  
}

再试试

板凳
voodoo 发表于 2014-5-14 23:17:36
kerrydu 发表于 2014-5-14 23:03
问题在于后面的local没有定义

clear

local data: dir "." files "*.dta"
用local data: dir "." files "*.dta"可能存在以下可能很难发觉的潜在错误:
1. 由于此时循环体中的 append using `v'.dta, force中的文件名将包含.dta.dta双重后缀,append命令将报“file not found”的错误;
2. 即使在循环体中改为append using `v', force,也会面临如下问题:
    * 若文件夹中还包含其他.dta文档(很可能),则local data中将包括这些文件,这会将其他dta文档也append进来;
    **  即使目前文件夹中不包含其他.dta文档,若像楼主要求那样将append后的文档存为final.dta(即循环后save final.dta, replace),则之后再执行这个do文档,将会把final.dta也(重复)append进来。这就导致我们执行do文档后得到的结果有错,且不具reproducible。



已有 1 人评分学术水平 热心指数 信用等级 收起 理由
╰不滅信念 + 1 + 1 + 1 精彩帖子

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

巫毒上传,必属佳品!
坛友下载,三思后行!

报纸
kerrydu 发表于 2014-5-14 23:41:03
clear
local data: dir "." files "*csv.dta"
foreach v of local data{
        append using `v',force  
}

再试试

地板
kerrydu 发表于 2014-5-14 23:42:09
save `s'.dta,replace。。。
文件的名后面应该是csv.dta

7
benbenbenben 发表于 2014-5-15 05:27:53
kerrydu 发表于 2014-5-14 23:42
save `s'.dta,replace。。。
文件的名后面应该是csv.dta
确实如此,csv 成了.dta文件名的一部分,请问,怎么可以把文件名中多余的csv去掉,看着很碍眼谢谢

8
benbenbenben 发表于 2014-5-15 07:18:36
voodoo 发表于 2014-5-14 23:17
用local data: dir "." files "*.dta"可能存在以下可能很难发觉的潜在错误:
1. 由于此时循环体中的 app ...
讲解太到位了,非常感谢,我确实遇到了这个问题,在执行第一段的时候,要生成.dta文件,stata显示如下:
(67 vars, 379914 obs)
(note: file 文件名.csv.dta not found)
file 文件名.csv.dta saved

实际上在我的数据文件夹里已经把该.csv 转化成了.dta, 但是为什么还显示file not found的错误呢;

我改了文件的名字成数字的形式,用了foreach num of numlist ....{
                                                              append using `num', force
                                                   }

       虽然可行了,但是,还是会出现file not found, 这样会影响到我最终合并的数据吗,粗略检查貌似没有但不知道是否有潜在的影响, 如何消除这个问题,谢谢。                                                

9
benbenbenben 发表于 2014-5-15 07:24:07
voodoo 发表于 2014-5-14 22:40
你假如是逐段执行程序的话,在执行第二段程序时,第一段程序中定义的local data的内容将丢失,也就是说此 ...
谢谢!对这段程序些疑问:
1.起初是一次性执行的,没有分段执行,出现了上面的错误;那么在一次性执行的情况下,是否也是需要在第二段中定义local data,还是只在分段执行中,需要地第二段定义local data;

2.local data: dir "." files "*.csv" 是typo吗? 应该是 local data: dir "." files "*.csv.dta"吗,还是这是另外的一种方式appending的.
clear
local data: dir "." files "*.csv"
foreach v of local data {
         append using `v'.dta, force
}
save final.dta, replace

10
voodoo 发表于 2014-5-15 09:46:02
benbenbenben 发表于 2014-5-15 07:18
讲解太到位了,非常感谢,我确实遇到了这个问题,在执行第一段的时候,要生成.dta文件,stata显示如下:
(67 vars, 379914 obs)
(note: file 文件名.csv.dta not found)
file 文件名.csv.dta saved
这不是报错——因为你的save命令有replace选项,所以Stata反馈信息说:没有发现“文件名.csv.dta”,然后就帮你把数据集保存为“文件名.csv.dta”啦。









巫毒上传,必属佳品!
坛友下载,三思后行!

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-30 11:46