2

私は R を使用しており、2 つの要素 (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
4

5 に答える 5

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してください)。

于 2012-09-12T00:24:46.423 に答える
3

プライヤは必要ありません。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

この例の最初の引数は column のいずれかである可能性があります。または、少しエレガントではない bu でそれを行うこともできます。おそらくより明確です。

dat$actno <- with( dat, ave(hhid, hhid, perid, FUN=function(x) seq(length(x) ) ) )
于 2012-09-11T21:43:45.890 に答える
2

あなたのデータが呼び出された場合、あなたurdatなしplyrで行うことができます:

df <- urdat[order(urdat$hhid, urdat$perid),]
df$actno <- sequence(rle(df$perid)$lengths)
于 2012-09-11T21:14:27.283 に答える
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
于 2012-09-11T20:34:43.457 に答える
-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を使用する場合は、簡単に実装できるはずです。

于 2012-10-06T21:04:26.007 に答える