2013-02-24 72 views
3

將問卷傳遞給教師以檢查其課程偏好。他們不得不從大約50個選項中選擇20個項目。 由此產生的數據是以下類型的選擇,一個長長的清單: 教師ID,問題IDR將調查問卷選擇的長列表轉換爲每個調查問卷一行的數據框

我想將它格式化爲一個行每個教師以及每個問題上colomn與可能的值的列表: 0(未選擇),1(選擇)。 在僞代碼(一種編程語言)
它很可能是這樣的:

iterate list { 
    data [teacher_id] [question_id] = 0 
} 

下面是一個示例數據和預期的結果:

a <- data.frame(
    Case_ID = c(1,1,2,2,4,4), 
    Q_ID = c(3,5,5,8,2,6) 
) 

預期的結果是

res <- data.frame(
    Case_ID = c(1,2,4), 
    Q_1 = c(0,0,0), 
    Q_2 = c(0,0,1), 
    Q_3 = c(1,0,0), 
    Q_4 = c(0,0,0), 
    Q_5 = c(1,1,0), 
    Q_6 = c(0,0,1), 
    Q_7 = c(0,0,0), 
    Q_8 = c(0,1,0) 
) 

任何幫助將不勝感激。

TNX 的Hed

+0

你想要的結果具體作爲data.frame或者你更喜歡矩陣嗎? – 2013-02-24 20:29:16

回答

0

需要注意的是你能想到的a作爲indecies的列表,其本身的參考哪些細胞在一「主數組」是TRUE。 然後,如果你有一個主矩陣,說所有的0' S的res,那麼你可以告訴R:「所有在a引用的元素應該是1」 這將在下面

首先一點,我們創建了「主矩陣「

# identify the unique teacher ID's 
teacherIDs <- unique(a$Case_ID) 

# count how many teachers there are 
numbTeachers <- length(teacherIDs) 

# create the column names for the questions 
colNames <- c(paste0("Q_", 1:50)) 

# dim names for matrix. Using T_id for the row names 
dnames <- list(paste0("T_", teacherIDs), 
       colNames) 
# create the matrix 
res2 <- matrix(0, ncol=50, nrow=numbTeachers, dimnames=dnames) 

接下來我們將a轉換爲一組索引。
*請注意,如果有教師ID不存在,則僅需要下面的前兩行。即在你的例子中,T_3不存在*

# create index out of a 
indx <- a 
indx$Case_ID <- as.numeric(as.factor(indx$Case_ID)) 
indx <- as.matrix(indx) 

# populate those in a with 1 
res2[indx] <- 1 

res2 
+0

仍然不知道那裏發生了什麼 但它完美地爲我工作。 – Hed 2013-02-25 21:02:09

2

返回一個matrix和使用matrix索引做的工作:

m <- matrix(0, nrow=3, ncol=8) 
rownames(m) <- c(1,2,4) 
colnames(m) <- 1:8 
idx <-apply(a, 2, as.character) 
m[idx] <- 1 

m 
## 1 2 3 4 5 6 7 8 
## 1 0 0 1 0 1 0 0 0 
## 2 0 0 0 0 1 0 0 1 
## 4 0 1 0 0 0 1 0 0