使用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
答案 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
mutate
或transform
,基础R ave
或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)]
会起作用,并且速度会快一点。
答案 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