我是一名应用研究员,主要负责全国范围内的注册数据,他正在从Stata过渡到R. dplyr
软件包使我的大部分日常数据管理任务顺利进行 . 尽管如此,我目前正在努力让R根据嵌套循环生成新变量 .
假设我们在1990年至1992年间出生的六名参与者中有以下数据集,其中包括2001 - 2004年间平均成绩点的测量值 .
* Stata
clear all
input id byear gpa2000 gpa2001 gpa2002 gpa2003 gpa2004
1 1990 1.2 1.3 1.4 1.5 1.3
2 1990 2.3 2.5 2.2 2.1 2.6
3 1991 3.1 3.9 3.4 3.5 4.0
4 1991 2.6 3.1 2.4 1.9 3.1
5 1992 1.4 1.8 3.2 2.3 3.2
6 1992 3.5 4.0 4.0 4.0 3.9
end
list
+--------------------------------------------------------------+
| id byear gpa2000 gpa2001 gpa2002 gpa2003 gpa2004 |
|--------------------------------------------------------------|
1. | 1 1990 1.2 1.3 1.4 1.5 1.3 |
2. | 2 1990 2.3 2.5 2.2 2.1 2.6 |
3. | 3 1991 3.1 3.9 3.4 3.5 4 |
4. | 4 1991 2.6 3.1 2.4 1.9 3.1 |
5. | 5 1992 1.4 1.8 3.2 2.3 3.2 |
6. | 6 1992 3.5 4 4 4 3.9 |
+--------------------------------------------------------------+
或等效于R:
df <- read.table(header=T, text="id byear gpa2000 gpa2001 gpa2002 gpa2003 gpa2004
1 1990 1.2 1.3 1.4 1.5 1.3
2 1990 2.3 2.5 2.2 2.1 2.6
3 1991 3.1 3.9 3.4 3.5 4.0
4 1991 2.6 3.1 2.4 1.9 3.1
5 1992 1.4 1.8 3.2 2.3 3.2
6 1992 3.5 4.0 4.0 4.0 3.9
")
我现在想要生成三个新变量来衡量每个参与者在10到12岁之间的GPA(gpa_age10 ... gpa_age12) .
在Stata中,我通常会通过嵌套for循环的方式来做到这一点:
forval i = 10/12 {
gen gpa_age`i' = .
forval j = 1990/1992 {
replace gpa_age`i' = gpa`=`j'+`i'' if byear == `j'
}
}
这将导致以下数据集:
+-----------------------------------------------------------------------------------------------+
| id byear gpa2000 gpa2001 gpa2002 gpa2003 gpa2004 gpa_a~10 gpa_a~11 gpa_a~12 |
|-----------------------------------------------------------------------------------------------|
1. | 1 1990 1.2 1.3 1.4 1.5 1.3 1.2 1.3 1.4 |
2. | 2 1990 2.3 2.5 2.2 2.1 2.6 2.3 2.5 2.2 |
3. | 3 1991 3.1 3.9 3.4 3.5 4 3.9 3.4 3.5 |
4. | 4 1991 2.6 3.1 2.4 1.9 3.1 3.1 2.4 1.9 |
5. | 5 1992 1.4 1.8 3.2 2.3 3.2 3.2 2.3 3.2 |
6. | 6 1992 3.5 4 4 4 3.9 4 4 3.9 |
+-----------------------------------------------------------------------------------------------+
我知道可能没有将这个Stata代码直接转换为R,但在R中复制这些结果的最佳方法是什么?
2 回答
您可以将data.frame重新整形为一个表单,其中每行代表使用
reshape2
包的学生的一年 . 然后计算年龄变得微不足道 . 这是完成此任务的完整代码,假设您的data.frame来自上面的变量名为dat
:此外,您可以通过转换融合的data.frame来获取您请求的data.frame:
我知道@ cr1msonB1ade已经很好地解决了这个问题,但是在R中显示了一个嵌套的for循环版本以匹配发布的Stata代码: