esi*_*rot 5 for-loop r local stata stata-macros
我是一个Stata用户,正在过渡到R,有一个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...
Run Code Online (Sandbox Code Playgroud)
我想产生两个新的变量,varX并varY认为采取对值varX06和varY06分别在今年6,varX07并varY07分别在今年为7,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...
Run Code Online (Sandbox Code Playgroud)
需要澄清的是,我知道我可以使用meltand reshape命令来实现-本质上是将数据从宽格式转换为长格式,但是我不想诉诸于此。那不是我的问题的意图。
我的问题是关于如何在R中循环遍历存根名称的本地宏列表,而我只是用这个简单的示例来说明一个更为通用的难题。
在Stata中,我可以生成存根名称的本地宏列表:
local stub varX varY
Run Code Online (Sandbox Code Playgroud)
然后遍历宏列表。如果year为6,我可以生成一个新变量varX或varY用varX06或varY06(分别)替换新变量值,依此类推。
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
}
Run Code Online (Sandbox Code Playgroud)
最后一部分是我在R中最难复制的部分。撰写本文时'x'06,Stata接受字符串“ varX”,将其与字符串“ 06”连接,然后返回变量varX06的值。另外,当我编写时'i',Stata返回字符串“ varX”而不是字符串“'i'”。
我如何用R做这些事情?
我已经搜索了Muenchen的“ Stata用户的R”,在网上搜索了一下,然后搜索了StackOverflow上的以前的帖子,但是找不到R解决方案。
如果这个问题很简单,我深表歉意。如果以前已经回答过,请直接给我答复。
预先感谢,
塔拉
嗯,这是一种方法。R 数据框中的列可以使用其字符名称来访问,因此这将起作用:
# create sample dataset
set.seed(1) # for reproducible example
df <- data.frame(year=as.factor(rep(6:8,each=100)), #categorical variable
varX06 = rnorm(300), varX07=rnorm(300), varX08=rnorm(100),
varY06 = rnorm(300), varY07=rnorm(300), varY08=rnorm(100))
# you start here...
years <- unique(df$year)
df$varX <- unlist(lapply(years,function(yr)df[df$year==yr,paste0("varX0",yr)]))
df$varY <- unlist(lapply(years,function(yr)df[df$year==yr,paste0("varY0",yr)]))
print(head(df),digits=4)
# year varX06 varX07 varX08 varY06 varY07 varY08 varX varY
# 1 6 -0.6265 0.8937 -0.3411 -0.70757 1.1350 0.3412 -0.6265 -0.70757
# 2 6 0.1836 -1.0473 1.5024 1.97157 1.1119 1.3162 0.1836 1.97157
# 3 6 -0.8356 1.9713 0.5283 -0.09000 -0.8708 -0.9598 -0.8356 -0.09000
# 4 6 1.5953 -0.3836 0.5422 -0.01402 0.2107 -1.2056 1.5953 -0.01402
# 5 6 0.3295 1.6541 -0.1367 -1.12346 0.0694 1.5676 0.3295 -1.12346
# 6 6 -0.8205 1.5122 -1.1367 -1.34413 -1.6626 0.2253 -0.8205 -1.34413
Run Code Online (Sandbox Code Playgroud)
对于给定的yr,匿名函数提取具有该行yr和名为 的列"varX0" + yr( 的结果paste0(...)。然后lapply(...)对每年“应用”此函数,并将unlist(...)返回的列表转换为向量。