2013-02-24 80 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