R等同于Stata的本地宏列表上的Stata for循环

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)

我想产生两个新的变量,varXvarY认为采取对值varX06varY06分别在今年6,varX07varY07分别在今年为7,varX08varY08分别在今年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,我可以生成一个新变量varXvarYvarX06varY06(分别)替换新变量值,依此类推。

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解决方案。

如果这个问题很简单,我深表歉意。如果以前已经回答过,请直接给我答复。

预先感谢,
塔拉

jlh*_*ard 2

嗯,这是一种方法。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(...)返回的列表转换为向量。

  • 您还可以将其作为一个循环来轻松处理许多存根:stub &lt;- c("varX","varY"); for(i 在存根中) df[,i] &lt;- unlist(lapply(years,function(yr)df[df$year==yr,paste(i,"0",yr,sep="")])) (2认同)