我是一个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...
我想生成两个新变量
varX
和varY
,当year为6时分别采用varX06
和varY06
的值,当year为7时分别采用varX07
和varY07
,当year为8时分别采用varX08
和varY08
。最终数据集应如下所示:
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中循环遍历 stub 名称的本地宏列表,而我只是使用这个简单的示例来说明一个更为通用的难题。
在Stata中,我可以生成 stub 名称的本地宏列表:
local stub varX varY
然后遍历宏列表。我可以生成一个新的变量
varX
或varY
,并且如果year为6,则分别用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
}
最后一部分是我在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/