0

R を使用して、2 つの要因 (HHID と PERID) でグループ化しながら、別の列 (ActNo) の最大数を示す新しい列 (MaxAct) を作成したいと思います。

たとえば、次のデータセットがあります。

UID HHID PERID ActNo
1   1000 1     1
2   1000 1     2
3   1000 1     3
4   1000 2     1
5   1000 2     2
6   2000 1     1
7   2000 1     2
8   2000 1     3
9   2000 1     4
10  2000 2     1
11  2000 2     2

次に、次のように新しい列 (MaxAct) を追加します。

UID HHID PERID ActNo MaxAct
1   1000 1     1     3
2   1000 1     2     3
3   1000 1     3     3
4   1000 2     1     2
5   1000 2     2     2
6   2000 1     1     4
7   2000 1     2     4
8   2000 1     3     4
9   2000 1     4     4
10  2000 2     1     2
11  2000 2     2     2
4

4 に答える 4

6
dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=max) )

結果の長さを行数と等しくしたい単一ベクトルとグループ化を含む問題の場合ave、選択した関数です。より複雑な問題の場合、lapply(split(dat, fac), FUN)アプローチが必要になるか、使用される場合がありますdo.call(rbind, by( ...))

欠損値がある場合:

dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=function(x) max(x, na.rm=TRUE) )  )
于 2012-09-11T23:01:14.757 に答える
6

plyrこれは、 withmutateまたはtransform、ベース Rave またはdata.table(ここではピーナッツの大ハンマーと見なされる場合があります) の標準運賃です。

plyrとのave アプローチは対処されているので、

データ表

library(data.table)
DT <- data.table(DF)
DT[,MaxAct := max(ActNo), by = list(HHID, PERID)]

データのサイズを考えると、メモリの効率的で高速な性質 data.tableはおそらく必要ありません。

前の質問How to Create a Column of Ranking While Grouping in Rmax(ActNo)を読んだので、それは単に各グループの行数であることがわかります

DT[,MaxAct := .N, by = list(HHID, PERID)]

動作し、わずかに速くなります。

于 2012-09-11T23:07:31.830 に答える
4

R には、このタスクを達成するためのいくつかのアプローチがあります。私にとって、これを行う最も簡単な方法は、plyrパッケージを使用することです

require(plyr)
ddply(dat, .(HHID, PERID), transform, MaxAct = max(ActNo))

   UID HHID PERID ActNo MaxAct
1    1 1000     1     1      3
2    2 1000     1     2      3
3    3 1000     1     3      3
4    4 1000     2     1      2
5    5 1000     2     2      2
6    6 2000     1     1      4
7    7 2000     1     2      4
8    8 2000     1     3      4
9    9 2000     1     4      4
10  10 2000     2     1      2
11  11 2000     2     2      2
于 2012-09-11T23:04:39.710 に答える
1
df <- read.table(textConnection("UID HHID PERID ActNo
1   1000 1     1
2   1000 1     2
3   1000 1     3
4   1000 2     1
5   1000 2     2
6   2000 1     1
7   2000 1     2
8   2000 1     3
9   2000 1     4
10  2000 2     1
11  2000 2     2"), header=T)


> ddply(df, .(HHID, PERID), transform, MaxAct = length(unique(ActNo)) )
   UID HHID PERID ActNo MaxAct
1    1 1000     1     1      3
2    2 1000     1     2      3
3    3 1000     1     3      3
4    4 1000     2     1      2
5    5 1000     2     2      2
6    6 2000     1     1      4
7    7 2000     1     2      4
8    8 2000     1     3      4
9    9 2000     1     4      4
10  10 2000     2     1      2
11  11 2000     2     2      2
于 2012-09-11T23:04:21.877 に答える