【发布时间】:2014-11-10 02:16:14
【问题描述】:
我是一名正在过渡到 R 的 Stata 用户,我发现我很难放弃一个 Stata 拐杖。这是因为我不知道如何用 R 的“应用”函数来做等效的事情。
在 Stata 中,我经常生成存根名称的本地宏列表,然后循环遍历该列表,调用名称由这些存根名称构建的变量。
举个简单的例子,假设我有以下数据集:
study_id year varX06 varX07 varX08 varY06 varY07 varY08
1 6 50 40 30 20.5 19.8 17.4
1 7 50 40 30 20.5 19.8 17.4
1 8 50 40 30 20.5 19.8 17.4
2 6 60 55 44 25.1 25.2 25.3
2 7 60 55 44 25.1 25.2 25.3
2 8 60 55 44 25.1 25.2 25.3
and so on...
我想生成两个新变量,varX 和 varY,它们在年份为 6 时分别采用 varX06 和 varY06 的值,在年份为 7 时分别采用 varX07 和 varY07,和varX08 和varY08 在年份为8 时。
最终的数据集应如下所示:
study_id year varX06 varX07 varX08 varY06 varY07 varY08 varX varY
1 6 50 40 30 20.5 19.8 17.4 50 20.5
1 7 50 40 30 20.5 19.8 17.4 40 19.8
1 8 50 40 30 20.5 19.8 17.4 30 17.4
2 6 60 55 44 25.1 25.2 25.3 60 25.1
2 7 60 55 44 25.1 25.2 25.3 55 25.2
2 8 60 55 44 25.1 25.2 25.3 44 25.3
and so on...
澄清一下,我知道我可以使用melt 和reshape 命令来做到这一点——本质上是将这些数据从宽格式转换为长格式,但我不想诉诸于此。这不是我的问题的意图。
我的问题是关于如何在 R 中循环存根名称的本地宏列表,我只是使用这个简单的示例来说明一个更通用的困境。
在 Stata 中,我可以生成存根名称的本地宏列表:
local stub varX varY
然后循环遍历宏列表。我可以生成一个新变量 varX 或 varY 并用 varX06 或 varY06 的值(分别)替换新变量值,如果年份是 6 等等。
foreach i of local stub {
display "`i'"
gen `i'=.
replace `i'=`i'06 if year==6
replace `i'=`i'07 if year==7
replace `i'=`i'08 if year==8
}
最后一部分是我发现在 R 中最难复制的部分。当我写 'x'06 时,Stata 将字符串“varX”与字符串“06”连接起来,然后返回变量 varX06 的值.此外,当我写'i' 时,Stata 返回字符串“varX”而不是字符串“'i'”。
我如何用 R 做这些事情?
我搜索了 Muenchen 的“Stata 用户的 R”,用 Google 搜索了网络,并在 StackOverflow 上搜索了以前的帖子,但找不到 R 解决方案。
如果这个问题很简单,我深表歉意。如果之前已经回答过,请引导我到回复。
提前致谢,
度母
【问题讨论】:
标签: r for-loop stata local stata-macros