0

使用 R,我想创建一个新列 (MaxAct),显示不同列 (ActNo) 的最大数量,同时按两个因素 (HHID 和 PERID) 分组

例如,我有这个数据集:

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

这是plyrwith mutateor transform,base R ave or的标准票价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 Ranks While Grouping in R,所以我们知道这max(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 回答