我想把布拉德利-特里模型与许多观察者从一组更大的物体中选出的三个物体的排名相匹配。
我的原始数据如下:
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}的输入,我需要的是如下所示的表,它包含列名对象在行名对象之前由五个观察者排列的次数。我发现的所有信息都是以数据的形式开始的,但由于我的观测量很高,我想知道是否有一种方法可以实现这种转换的自动化。
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任何想法都非常感谢!
发布于 2015-11-10 10:26:16
好的,这是使用嵌套for循环和match的答案..。
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。然后我们运行循环如下..。
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。
https://stackoverflow.com/questions/33608576
复制相似问题