使用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
Run Code Online (Sandbox Code Playgroud)
然后我想添加新列(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
Run Code Online (Sandbox Code Playgroud)
dat$MaxAct <- with(dat, ave(ActNo, HHID, PERID, FUN=max) )
Run Code Online (Sandbox Code Playgroud)
对于涉及单个向量和分组的问题,您希望结果的长度等于行数,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) ) )
Run Code Online (Sandbox Code Playgroud)
这是plyr
与mutate
或者transform
基地R ave
或data.table
(在这里可能被认为是花生的大锤)的标准票价.
这些plyr
和ave
方法已得到解决
library(data.table)
DT <- data.table(DF)
DT[,MaxAct := max(ActNo), by = list(HHID, PERID)]
Run Code Online (Sandbox Code Playgroud)
考虑到数据的大小,data.table
可能不需要存储器有效且快速的特性 .
已阅读上一个问题如何在R中进行分组时创建等级列,因此我们知道这max(ActNo)
只是每个组中的行数
DT[,MaxAct := .N, by = list(HHID, PERID)]
Run Code Online (Sandbox Code Playgroud)
会工作,而且会更快.