4

ここ数年は 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

次のように、既存のデータセットに Max.Age ({popname, sex,year で定義された特定のサブグループの最大 Age を計算する) という新しい集計変数を作成したいと思います。

   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

Stata でこれを行うには、次のようにegenコマンドとbyコマンドを使用します。

by State City Day, sort:
egen cnt=seq(), from(23) to(72) block(1);  

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)

lapplyByは元のデータセット (IDB) よりも短い長さの集約されたデータセットを返すため、これは機能しません。

Rで「by | egen」タイプのStataコードを本質的に実装する方法について、誰かが親切に私を正しい方向に向けることができますか?

ありがとう

4

4 に答える 4

5

R でわかることの 1 つは、物事を行う方法は 1 つだけではないということです。1 つの方法は、ave関数を使用することです。

IDB$max.age <- ave(IDB$age, IDB$popname, IDB$sex, IDB$year, FUN=max)
于 2011-06-23T03:45:47.353 に答える
4

ddplyパッケージから使用することをお勧めしplyrます (ただし、このようなことを行う方法はたくさんあります)。データフレームが呼び出されると仮定しますdat

result <- ddply(dat,.(popname,sex,year),.fun = function(x){
                                         x$max.age <- max(x$age,na.rm=TRUE)
                                         return(x)})

ddply の無名関数は、各ピースに列を追加し、そのピースの最大年齢を示します。

于 2011-06-23T03:46:59.947 に答える
3

数年前に Stata egen のドキュメントを読んでみたところ、完全に不透明であることがわかったので、一般的な回答はしません。この目的で使用する関数 (グループを適用した関数から同じ長さのベクトルを返す) は次のave()とおりです。

dfrm$max.age <- with( dfrm, ave(age, list(popname, sex,year), FUN=max, na.rm=TRUE) )

警告は表示されますが、操作は成功します。おそらく、グループ化変数の外積により、後で破棄される空のカテゴリが作成されます。これらは Joshua のバージョンでも発生し、na.rm=TRUE を削除しても警告は変わりません。

1: In FUN(X[[20L]], ...) : no non-missing arguments to max; returning -Inf
于 2011-06-23T03:45:11.770 に答える