如何创建一个包含R中另一列的最大值的列?

时间:2012-09-11 22:55:01

标签: r data.table plyr

使用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 个答案:

答案 0 :(得分: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) )  )

答案 1 :(得分:6)

这是plyr mutatetransform,基础R avedata.table的标准票价(这可能被认为是花生的大锤) )。

已解决plyrave方法

data.table

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)]

会起作用,并且速度会快一点。

答案 2 :(得分:3)

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

答案 3 :(得分: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