3

一份问卷被传递给教师,以检查他们的课程偏好。他们必须从大约 50 个选项中选择 20 个项目。结果数据是以下类型的一长串选项:教师 ID、问题 ID

我想将其格式化为一个列表,每个老师一个行,每个问题一个列,可能的值: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

4

2 回答 2

2

返回 amatrix并使用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
于 2013-02-24T20:34:12.083 回答
0

请注意,您可以将其a视为索引列表,它们本身引用“主数组”中的哪些单元格TRUE。然后,如果你有一个主矩阵,比如说res所有0'的 s,你可以告诉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
于 2013-02-24T20:42:13.753 回答