首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从部分排名中生成BTm的输入表

如何从部分排名中生成BTm的输入表
EN

Stack Overflow用户
提问于 2015-11-09 11:56:41
回答 1查看 107关注 0票数 1

我想把布拉德利-特里模型与许多观察者从一组更大的物体中选出的三个物体的排名相匹配。

我的原始数据如下:

代码语言:javascript
复制
obs1=c("A","C","D")
obs2=c("B","D","E")
obs3=c("C","B","E")
obs4=c("C","D","E")
obs5=c("C","E","D")
data=cbind(obs1,obs2,obs3,obs4,obs5)

    obs1 obs2 obs3 obs4 obs5
1   A    B    C    C    C
2   C    D    B    D    E
3   D    E    E    E    D

但是,作为countsToBinomial{BradleyTerry2}BTm{BradleyTerry2}的输入,我需要的是如下所示的表,它包含列名对象在行名对象之前由五个观察者排列的次数。我发现的所有信息都是以数据的形式开始的,但由于我的观测量很高,我想知道是否有一种方法可以实现这种转换的自动化。

代码语言:javascript
复制
    A    B    C    D    E
A   0    0    0    0    0
B   0    0    1    0    0
C   1    0    0    0    0
D   1    1    3    0    1
E   0    2    3    2    0

任何想法都非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 10:26:16

好的,这是使用嵌套for循环和match的答案..。

代码语言:javascript
复制
x <- unique(as.vector(data))
x <- sort(x)
cmatrix <- matrix(0,nrow = length(x), ncol = length(x))
colnames(cmatrix) <- x
row.names(cmatrix) <- x

这将您的输出矩阵创建为cmatrix,初始值全部为0。然后我们运行循环如下..。

代码语言:javascript
复制
count <- 0
for (i in 1:ncol(cmatrix) ){
    for (j in 1:nrow(cmatrix) ){
        for (k in 1:ncol(data)){
            if( is.na(match(colnames(cmatrix)[i],data[,k])) == FALSE){
            if( is.na(match(row.names(cmatrix)[j],data[,k])) == FALSE){
            if( match(colnames(cmatrix)[i],data[,k]) < match(row.names(cmatrix)[j],data[,k]) ){count <- count+1} 
            }
            cmatrix[j,i] <- cmatrix[j,i]+count
            }
            count <- 0
        }
    }
}

这将为您提供所需的输出表。该解决方案适用于任意数量的值,而不仅仅适用于A到E。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33608576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档