3

次のような会議への出席を示すデータのリストがあります。

Event                     Participant  
ConferenceA               John   
ConferenceA               Joe  
ConferenceA               Mary    
ConferenceB               John  
ConferenceB               Ted  
ConferenceC               Jessica  

次の形式のバイナリ インジケーター出席マトリックスを作成したいと思います。

Event        John  Joe  Mary  Ted  Jessica  
ConferenceA  1     1    1     0    0  
ConferenceB  1     0    0     1    0  
ConferenceC  0     0    0     0    1  

Rでこれを行う方法はありますか?

4

3 に答える 3

11

data.frameあなたが「mydf」と呼ばれると仮定すると、単に次を使用しtableます。

> table(mydf)
             Participant
Event         Jessica Joe John Mary Ted
  ConferenceA       0   1    1    1   0
  ConferenceB       0   0    1    0   1
  ConferenceC       1   0    0    0   0

誰かが会議に複数回出席し、table1 より大きい値を返す可能性がある場合は、次のように、1 より大きいすべての値を 1 に単純に再コード化できます。

temp <- table(mydf)
temp[temp > 1] <- 1

これは を返すことに注意してくださいtable。を返したい場合は、次data.frameを使用しますas.data.frame.matrix

> as.data.frame.matrix(table(mydf))
            Jessica Joe John Mary Ted
ConferenceA       0   1    1    1   0
ConferenceB       0   0    1    0   1
ConferenceC       1   0    0    0   0

上記では、「mydf」は次のように定義されています。

mydf <- structure(list(Event = c("ConferenceA", "ConferenceA", 
  "ConferenceA", "ConferenceB", "ConferenceB", "ConferenceC"), 
  Participant = c("John", "Joe", "Mary", "John", "Ted", "Jessica")), 
  .Names = c("Event", "Participant"), class = "data.frame", 
  row.names = c(NA, -6L))

今後も同様の方法でデータを共有してください。

于 2013-07-02T17:02:16.663 に答える
1

@Anandaの答えははるかに優れていますが、 qdapを使用して別のアプローチを投げると思いました。「誰かが会議に複数回参加した」場合にのみ輝きます。

アナンダが指摘したように、「誰かが会議に複数回参加しただろう」という例を含めました。この場合、adjmat関数を使用してブール行列を引き出すと役立つ場合があります。

二重参加者のデータ:

## dat <- read.table(text="Event                     Participant  
## ConferenceA               John   
## ConferenceA               Joe  
## ConferenceA               Mary    
## ConferenceB               John  
## ConferenceB               Ted  
## ConferenceB               Ted
## ConferenceC               Jessica  ", header=TRUE)

カウントの表:

library(qdap)
wfm(dat[, 1], dat[, 2], lower.case = FALSE)

## > wfm(dat[, 1], dat[, 2], lower.case = FALSE)
##             Jessica Joe John Mary Ted
## conferenceA       0   1    1    1   0
## conferenceB       0   0    1    0   2
## conferenceC       1   0    0    0   0

mtabulateで

with(dat, mtabulate(split(Participant, Event)))

##             Jessica Joe John Mary Ted
## ConferenceA       0   1    1    1   0
## ConferenceB       0   0    1    0   2
## ConferenceC       1   0    0    0   0

ブール行列:

adjmat(wfm(dat[, 1], dat[, 2], lower.case = FALSE))$boolean

## > adjmat(wfm(dat[, 1], dat[, 2], lower.case = FALSE))$boolean
##             Jessica Joe John Mary Ted
## conferenceA       0   1    1    1   0
## conferenceB       0   0    1    0   1
## conferenceC       1   0    0    0   0
于 2013-07-02T17:45:02.160 に答える