计算数据集子集的汇总统计量[R中Stata的"bysort"等价物是什么?]

Anu*_*ian 4 r stata

我在过去的几年里一直在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代码吗?

谢谢

Jos*_*ich 5

你会发现R有一件事就是不只有一种方法可以做.一种方法是通过该ave功能.

IDB$max.age <- ave(IDB$age, IDB$popname, IDB$sex, IDB$year, FUN=max)
Run Code Online (Sandbox Code Playgroud)