-1

以下のようなデータ構造があります

 id  year   club
"A" "2010" "C1"
"B" "2010" "C1"
"C" "2010" "C2"
"A" "2011" "C1"
"B" "2011" "C2"

など。私の問題は、各一意の個人が行に固定され、各一意のクラブが列に固定されている、年ごとにマトリックスを作成することです。特定の年に個人がクラブを訪れた場合、対応する交差するセルの値は 1 になり、それ以外の場合は 0 になります。

これに関するヘルプは大歓迎です。

ありがとうございます

4

3 に答える 3

3

ベース R では、 and を使用byxtabsます。

by(dat, dat$year, with, as.matrix(xtabs(~ id + club) * 1L))

行列のリストを返します (1 年に 1 つ)。1Lまた、ブール値の行列を返すために掛けないことをお勧めします。


Edit1: 提案されているように、分割表を非常に簡単に作成することもできます。

table(dat[c("id", "club", "year")])

Edit2:リカルドの答えに対するあなたのコメントを見ました。おそらくこれがあなたが探しているものです:

library(plyr)
ddply(dat, .(year, id), with, 1L * (table(club) > 0))
#   year id C1 C2
# 1 2010  A  1  0
# 2 2010  B  1  0
# 3 2010  C  0  1
# 4 2011  A  1  0
# 5 2011  B  0  1

.drop = FALSE可能な年/ID の組み合わせをすべて (6) 取得するために使用することもできます。

ddply(dat, .(year, id), with, 1L * (table(club) > 0), .drop = FALSE)
#   year id C1 C2
# 1 2010  A  1  0
# 2 2010  B  1  0
# 3 2010  C  0  1
# 4 2011  A  1  0
# 5 2011  B  0  1
# 6 2011  C  0  0
于 2013-07-14T16:14:13.380 に答える
0

コメントに基づいて、適切な形式は 3 次元配列または data.frames / data.tables のリストです。

    library(data.table)
DT <- data.table

### create a template matrix
# find all unique ID's and unique Club's
ids <- unique(DT$id)
clubs <- unique(DT$club)
# matrix template based on the number of ids & clubs
mat.template <- matrix(0L, nrow=length(ids), ncol=length(clubs), dimnames=list(ids, clubs))

# iterate over the unique values of year
DT <- data.table(dat, key="id,club")
res <- lapply(unique(DT$year), function(y) {
    # index the matrix by the DT where y == year. Set those values to 1
        mat <- copy(mat.template)
        mat[as.matrix(DT[y==year, list(id, club)])] <- 1
        mat
    })

setattr(res, "names", unique(DT$year))

結果:

res     

$`2010`
  C1 C2
A  1  0
B  1  0
C  0  1

$`2011`
  C1 C2
A  1  0
B  0  1
C  0  0
于 2013-07-14T15:55:03.880 に答える