我在过去的几年里一直在Stata编程,并且最近在4个月前转向了R.
我有以下格式的数据:
popname sex year age COUNTRY
329447 AUS f 1921 23 AUS
329448 AUS f 1921 24 AUS
329449 AUS f 1921 25 AUS
329450 AUS f 1921 26 AUS
329451 AUS f 1921 27 AUS
329452 AUS f 1921 28 AUS
...
329532 AUS f 1922 23 AUS
329533 AUS f 1922 24 AUS
329534 AUS f 1922 25 AUS
... ... . .. .. ...
297729 BLR f 1987 59 BLR
297730 BLR f 1987 60 BLR
297731 BLR f 1987 61 BLR
...
291941 BLR m 1973 71 BLR
291942 BLR m 1973 72 BLR
291993 BLR m 1974 23 BLR
Run Code Online (Sandbox Code Playgroud)
我想创建一个名为Max.Age的新摘要变量(它计算现有数据集中由{popname,sex,year定义的给定子组的最大年龄),如下所示:
popname sex year age COUNTRY max.age
329447 AUS f 1921 23 AUS 72
329448 AUS f 1921 24 AUS 72
329449 AUS f 1921 25 AUS 72
329450 AUS f 1921 26 AUS 72
329451 AUS f 1921 27 AUS 72
329452 AUS f 1921 28 AUS 72
...
329532 AUS f 1922 23 AUS 75
329533 AUS f 1922 24 AUS 75
329534 AUS f 1922 25 AUS 75
... ... . .. .. ...
297729 BLR f 1987 59 BLR 87
297730 BLR f 1987 60 BLR 87
297731 BLR f 1987 61 BLR 87
...
291941 BLR m 1973 71 BLR 78
291942 BLR m 1973 72 BLR 78
291993 BLR m 1974 23 BLR 78
Run Code Online (Sandbox Code Playgroud)
要在Stata中执行此操作,可以使用带有by命令的egen命令,如下所示:
by State City Day, sort:
egen cnt=seq(), from(23) to(72) block(1);
Run Code Online (Sandbox Code Playgroud)
我尝试使用doBy包在R中执行此操作.这是我写的代码:
IDB <- orderBy(~popname+sex+year+age, data=IDB)
v<-lapplyBy(~sex+year, data=IDB, function(d) c(NA,max(d$age)))
IDB$Max.age <- unlist(v)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为lapplyBy返回的长度小于原始数据集(IDB)的聚合数据集.
有人可以指出我如何在R中实质上实现"by | egen"类型的Stata代码吗?
谢谢
你会发现R有一件事就是不只有一种方法可以做.一种方法是通过该ave功能.
IDB$max.age <- ave(IDB$age, IDB$popname, IDB$sex, IDB$year, FUN=max)
Run Code Online (Sandbox Code Playgroud)