将 Stata 翻译成 R:崩溃
Translating Stata to R: collapse
刚刚遇到一个 .do
文件,我需要将其翻译成 R
,因为我没有 Stata 许可证;我的 Stata 生锈了,所以有人可以确认代码是否按照我的想法运行吗?
为了可重复性,我将把它翻译成我在网上找到的数据集,特别是 Milk Production dataset (p004) Chatterjee、Hadi 和 Price 的教科书的一部分。
这是 Stata 代码:
collapse (min) min_protein = protein ///
(mean) avg_protein = protein ///
(median) median_protein = protein ///
(sd) sd_protein = protein ///
if protein > 2.8, by(lactatio)
这是我认为它在 data.table
语法中所做的事情:
library(data.table)
library(foreign)
DT = read.dta("p004.dta")
setDT(DT)
DT[protein > 2.8,
.(min_protein = min(protein),
avg_protein = mean(protein),
median_protein = median(protein),
sd_protein = sd(protein)),
keyby = lactatio]
# lactatio min_protein avg_protein median_protein sd_protein
# 1: 1 2.9 3.162632 3.10 0.2180803
# 2: 2 2.9 3.304688 3.25 0.2858736
# 3: 3 2.9 3.371429 3.35 0.4547672
# 4: 4 2.9 3.231250 3.20 0.3419917
# 5: 5 2.9 3.855556 3.20 1.9086061
# 6: 6 3.0 3.200000 3.10 0.2645751
# 7: 7 3.3 3.650000 3.65 0.4949748
# 8: 8 3.2 3.300000 3.30 0.1414214
对吗?
如果我在过去 18 个月内使用过 Stata,或者我是否安装了一个副本,这将很容易确认——希望我能打听那些对这两种情况都属实的人的耳朵。谢谢。
您的直觉是正确的。 collapse
是 R 的 aggregate
函数的 Stata 等效项,它通过对数据集中的每个变量应用聚合函数(或多个聚合函数,每个变量一个)从输入数据集生成一个新数据集。
下面是 Stata 命令在示例数据集上的输出:
. list
+------------------------------------------------------+
| lactatio min_pr~n avg_pr~n median~n sd_pro~n |
|------------------------------------------------------|
1. | 1 2.9 3.162632 3.1 .2180803 |
2. | 2 2.9 3.304688 3.25 .2858736 |
3. | 3 2.9 3.371429 3.35 .4547672 |
4. | 4 2.9 3.23125 3.2 .3419917 |
5. | 5 2.9 3.855556 3.2 1.908606 |
|------------------------------------------------------|
6. | 6 3 3.2 3.1 .2645752 |
7. | 7 3.3 3.65 3.65 .4949748 |
8. | 8 3.2 3.3 3.3 .1414214 |
+------------------------------------------------------+
这是您的示例数据的 Stata 输出,与 data.table
输出相同:
collapse (min) min_protein = protein ///
(mean) avg_protein = protein ///
(median) median_protein = protein ///
(sd) sd_protein = protein ///
if protein > 2.8, by(lactatio)
lactatio min_protein avg_protein median_protein sd_protein
1 2.9 3.162632 3.1 0.2180803
2 2.9 3.304688 3.25 0.2858736
3 2.9 3.371429 3.35 0.4547672
4 2.9 3.23125 3.2 0.3419917
5 2.9 3.855556 3.2 1.908606
6 3 3.2 3.1 0.2645752
7 3.3 3.65 3.65 0.4949748
8 3.2 3.3 3.3 0.1414214
这里是 data.table
输出(只是为了确保我使用的是正确的数据)
library(foreign) #reading Stata data
data<-read.dta("p004.dta")
setkey(setDT(data),lactatio)
setDT(data)[protein>2.8,
.(min_protein=min(protein),
avg_protein=mean(protein),
median_protein=median(protein),
sd_protein=sd(protein)),
by=lactatio]
lactatio min_protein avg_protein median_protein sd_protein
1: 1 2.9 3.162632 3.10 0.2180803
2: 2 2.9 3.304688 3.25 0.2858736
3: 3 2.9 3.371429 3.35 0.4547672
4: 4 2.9 3.231250 3.20 0.3419917
5: 5 2.9 3.855556 3.20 1.9086061
6: 6 3.0 3.200000 3.10 0.2645751
7: 7 3.3 3.650000 3.65 0.4949748
8: 8 3.2 3.300000 3.30 0.1414214
>
stata.collapse<-function(data,vars,newnames,stat,by) {
m=match(by,names(data))
data1=data[m]
x=length(by)
l=length(stat)
for (i in 1:l){
nn=aggregate(data[vars[i]],by=data1,stat[i],na.rm=TRUE)
d=names(nn)
d[ncol(data1)+1]<-newnames[i]
names(nn)<-d
xx1=nn[1:x]
xx=nn[-(1:x)]
if (i>1) {
x2=cbind(x2,xx)
}else {
x2=nn
}
}
return(x2)
}
要运行这样调用这个函数
h=stata.collapse(roster,c("idcode1","age","age") ,
c("hhsize","meanage","maxage"),c("max","mean","max"),c("psu","hhno"))
刚刚遇到一个 .do
文件,我需要将其翻译成 R
,因为我没有 Stata 许可证;我的 Stata 生锈了,所以有人可以确认代码是否按照我的想法运行吗?
为了可重复性,我将把它翻译成我在网上找到的数据集,特别是 Milk Production dataset (p004) Chatterjee、Hadi 和 Price 的教科书的一部分。
这是 Stata 代码:
collapse (min) min_protein = protein ///
(mean) avg_protein = protein ///
(median) median_protein = protein ///
(sd) sd_protein = protein ///
if protein > 2.8, by(lactatio)
这是我认为它在 data.table
语法中所做的事情:
library(data.table)
library(foreign)
DT = read.dta("p004.dta")
setDT(DT)
DT[protein > 2.8,
.(min_protein = min(protein),
avg_protein = mean(protein),
median_protein = median(protein),
sd_protein = sd(protein)),
keyby = lactatio]
# lactatio min_protein avg_protein median_protein sd_protein
# 1: 1 2.9 3.162632 3.10 0.2180803
# 2: 2 2.9 3.304688 3.25 0.2858736
# 3: 3 2.9 3.371429 3.35 0.4547672
# 4: 4 2.9 3.231250 3.20 0.3419917
# 5: 5 2.9 3.855556 3.20 1.9086061
# 6: 6 3.0 3.200000 3.10 0.2645751
# 7: 7 3.3 3.650000 3.65 0.4949748
# 8: 8 3.2 3.300000 3.30 0.1414214
对吗?
如果我在过去 18 个月内使用过 Stata,或者我是否安装了一个副本,这将很容易确认——希望我能打听那些对这两种情况都属实的人的耳朵。谢谢。
您的直觉是正确的。 collapse
是 R 的 aggregate
函数的 Stata 等效项,它通过对数据集中的每个变量应用聚合函数(或多个聚合函数,每个变量一个)从输入数据集生成一个新数据集。
下面是 Stata 命令在示例数据集上的输出:
. list
+------------------------------------------------------+
| lactatio min_pr~n avg_pr~n median~n sd_pro~n |
|------------------------------------------------------|
1. | 1 2.9 3.162632 3.1 .2180803 |
2. | 2 2.9 3.304688 3.25 .2858736 |
3. | 3 2.9 3.371429 3.35 .4547672 |
4. | 4 2.9 3.23125 3.2 .3419917 |
5. | 5 2.9 3.855556 3.2 1.908606 |
|------------------------------------------------------|
6. | 6 3 3.2 3.1 .2645752 |
7. | 7 3.3 3.65 3.65 .4949748 |
8. | 8 3.2 3.3 3.3 .1414214 |
+------------------------------------------------------+
这是您的示例数据的 Stata 输出,与 data.table
输出相同:
collapse (min) min_protein = protein ///
(mean) avg_protein = protein ///
(median) median_protein = protein ///
(sd) sd_protein = protein ///
if protein > 2.8, by(lactatio)
lactatio min_protein avg_protein median_protein sd_protein
1 2.9 3.162632 3.1 0.2180803
2 2.9 3.304688 3.25 0.2858736
3 2.9 3.371429 3.35 0.4547672
4 2.9 3.23125 3.2 0.3419917
5 2.9 3.855556 3.2 1.908606
6 3 3.2 3.1 0.2645752
7 3.3 3.65 3.65 0.4949748
8 3.2 3.3 3.3 0.1414214
这里是 data.table
输出(只是为了确保我使用的是正确的数据)
library(foreign) #reading Stata data
data<-read.dta("p004.dta")
setkey(setDT(data),lactatio)
setDT(data)[protein>2.8,
.(min_protein=min(protein),
avg_protein=mean(protein),
median_protein=median(protein),
sd_protein=sd(protein)),
by=lactatio]
lactatio min_protein avg_protein median_protein sd_protein
1: 1 2.9 3.162632 3.10 0.2180803
2: 2 2.9 3.304688 3.25 0.2858736
3: 3 2.9 3.371429 3.35 0.4547672
4: 4 2.9 3.231250 3.20 0.3419917
5: 5 2.9 3.855556 3.20 1.9086061
6: 6 3.0 3.200000 3.10 0.2645751
7: 7 3.3 3.650000 3.65 0.4949748
8: 8 3.2 3.300000 3.30 0.1414214
>
stata.collapse<-function(data,vars,newnames,stat,by) {
m=match(by,names(data))
data1=data[m]
x=length(by)
l=length(stat)
for (i in 1:l){
nn=aggregate(data[vars[i]],by=data1,stat[i],na.rm=TRUE)
d=names(nn)
d[ncol(data1)+1]<-newnames[i]
names(nn)<-d
xx1=nn[1:x]
xx=nn[-(1:x)]
if (i>1) {
x2=cbind(x2,xx)
}else {
x2=nn
}
}
return(x2)
}
要运行这样调用这个函数
h=stata.collapse(roster,c("idcode1","age","age") ,
c("hhsize","meanage","maxage"),c("max","mean","max"),c("psu","hhno"))