0

我有一个从 Qualtrics 调查中提取的松鼠数据集。它看起来像这样:

V3       Q8_42  Q8_33  Q8_72   Q8_38  Q13_1_42 Q13_1_33 Q13_1_72 Q13_1_38
Chap A     .    1       .        .       .      4        .        .
Chap B     1    .       .        .       4      .        .        .
Chap C     .    .       .        .       .      .        .        .
Chap D     .    .       .        .       .      .        .        .

快照显示了四个人询问他们是否是朋友(q8_42 是 A;q8_33 是 B,q8_72 是 C,q8_38 是 D)。如果有人说他们是朋友,那么他们会以 1-5 的等级询问他们友谊的强度(q13_1_42 代表 A,q13_1_33 代表 B,q13_1_72 代表 C,q13_1_38 代表 D)。我总共有 95 个人,总共有 9 个问题向他们提出:他们的友谊。我应该如何运行矩阵运算,以便最终得到以下矩阵,每个友谊问题 1:

       Chap A   Chap B  Chap C  Chap D
Chap A  0       4       .       .
Chap B  4       0       .       .
Chap C  .       .       0       .
Chap D  .       .       .       0

我的解决方案是将数据(名为“kolp”)读入 R,然后运行

Chap.A <- (kolp$q8_42 * kolp$q13_1_42)
Chap.B <- (kolp$q8_33 * kolp$q13_1_33)
Chap.C <- (kolp$q8_72 * kolp$q13_1_72)
Chap.D <- (kolp$q8_38 * kolp$q13_1_38)
Mat.1 <- cbind(Chap.A, Chap.B, Chap.C, Chap.D)
rownames(Mat.1) <- c("Chap.A", "Chap.B", "Chap.C", "Chap.D")

这给了我

         Chap.A Chap.B Chap.C Chap.D
Chap.A     NA      4     NA     NA
Chap.B      4     NA     NA     NA
Chap.C     NA     NA     NA     NA
Chap.D     NA     NA     NA     NA

但我知道这是一种笨拙的方法,特别是有 9 个矩阵要提取为 *.csv 或 *.txt 文件,dim 为 95x95

4

1 回答 1

0

假设列的形式为“questionID_individualID”,您可以尝试使用此函数来处理您的数据:

f <- function(dat)
{
    n <- names(dat)

    id <- substring(n, nchar(n)-1)

    qu_id <- substring(n, 1, nchar(n)-3)

    individuals <- sort(unique(id))

    questions <- unique(qu_id)

    result <- 1

    for(q in questions)
    {
        filter <- qu_id==q

        result <- result * dat[,filter][,match(individuals, id[filter])]
    }

    result

    colnames(result) <- individuals

    result
}

用作f(kolp). 即使列无序,它也可以工作。但是,如果某些问题没有针对所有个人的列,它将失败(或给出错误的结果)。

于 2013-03-27T20:45:36.647 回答