我正在使用R,我想创建一个显示序列或排名的列,同时按两个因素(hhid和period)进行分组。
例如,我有这个数据集:
hhid perid
1000 1
1000 1
1000 1
1000 2
1000 2
2000 1
2000 1
2000 1
2000 1
2000 2
2000 2
我想添加一个名为“actno”的列,如下所示:
hhid perid actno
1000 1 1
1000 1 2
1000 1 3
1000 2 1
1000 2 2
2000 1 1
2000 1 2
2000 1 3
2000 1 4
2000 2 1
2000 2 2
答案 0 :(得分:4)
如果你有很多小组或大数据,data.table
是提高时间和记忆效率的方法
# assuming your data is in a data.frame called DF
library(data.table)
DT <- data.table(DF)
DT[, ActNo := seq_len(.N), by = list(hhid,perid)]
请注意.N
通过分组给出子集中的行数(有关详细信息,请参阅?data.table
)
答案 1 :(得分:3)
不需要plyr。只需使用ave
和seq
:
> dat$actno <- with( dat, ave(hhid, hhid, perid, FUN=seq))
> dat
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
这个实例中的第一个参数可以是列,也可以用稍微不那么优雅的方式来做,也许更清楚:
dat$actno <- with( dat, ave(hhid, hhid, perid, FUN=function(x) seq(length(x) ) ) )
答案 2 :(得分:2)
如果您的数据被调用urdat
,那么没有plyr
即可:
df <- urdat[order(urdat$hhid, urdat$perid),]
df$actno <- sequence(rle(df$perid)$lengths)
答案 3 :(得分:1)
plyr
包可以做得很好:
library(plyr)
dat <- structure(list(hhid = c(1000L, 1000L, 1000L, 1000L, 1000L, 2000L,
2000L, 2000L, 2000L, 2000L, 2000L), perid = c(1L, 1L, 1L, 2L,
2L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("hhid", "perid"), class = "data.frame", row.names = c(NA,
-11L))
ddply(dat, .(hhid, perid), transform, actno=seq_along(perid))
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
答案 4 :(得分:-4)
伪代码:
For each unique value of `hhid` `h`
For each unique value of `perid` `p`
counter = 0;
For each row of table where `hhid==h && perid==p`
counter++;
Assign counter to `actno` of this column
实施起来应该是微不足道的,特别是data frame。