我是一个Stata用户,正在过渡到R,有一个Stata拐杖我很难放弃。这是因为我不知道如何使用R的“应用”功能。

在Stata中,我经常生成本地 stub 名称的宏列表,然后遍历该列表,调用其名称基于这些 stub 名称构建的变量。

举一个简单的例子,假设我有以下数据集:

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...

我想生成两个新变量varXvarY,当year为6时分别采用varX06varY06的值,当year为7时分别采用varX07varY07,当year为8时分别采用varX08varY08

最终数据集应如下所示:
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...

需要澄清的是,我知道我可以使用meltreshape命令执行此操作-本质上是将数据从宽格式转换为长格式,但是我不想诉诸于此。那不是我的问题的意图。

我的问题是关于如何在R中循环遍历 stub 名称的本地宏列表,而我只是使用这个简单的示例来说明一个更为通用的难题。

在Stata中,我可以生成 stub 名称的本地宏列表:
local stub varX varY

然后遍历宏列表。我可以生成一个新的变量varXvarY,并且如果year为6,则分别用varX06varY06的值替换新的变量值。
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数据框中的列可以使用其字符名进行访问,因此可以使用:

# 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

对于给定的yr,匿名函数提取带有该yr的行和名为"varX0" + yr的列(paste0(...)的结果。然后lapply(...)每年“应用”此函数,然后unlist(...)将返回的列表转换为向量。

关于R等效于Stata的本地宏列表上的Stata for循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26835743/

10-12 18:58