我有一个数据框,我想从中执行每列值之间的成对比较。最终,我的目标是获得比较的交叉列表,其中每个值表示比较列中样本之间的相似性百分比。对于复制和我到目前为止所尝试的内容:
a <- c(1:30)
b <- c(30:1)
c <- c(1:10,30:11)
data <- as.data.frame(matrix(c(a,b,c), ncol = 3, nrow = 30))
fr<-apply(combn(1:length(data), 2), 2, function(x) {
result <- as.data.frame(table(
factor(sign(data[,x[1]] - data[,x[2]]), levels=c(0), labels=c("Fr"))
))
colnames(result)[1] <- paste(x, collapse="|")
return(result)
})
fr # returns a list of each comparison, with its respective similarity count
a<-sapply(fr, unlist) # My attempt to get a dataframe/matrix of the results
t(a)
t(a); sapply(fr, unlist); do.call(cbind, fr) # I get different arrangements, but none in the form:
1|2 0
1|3 10
2|3 0
一旦我获得了该格式的数据帧,获得交叉表表就会更加直接,
V.1 V.2 V.3
V.1 -
V.2 0 -
V.3 10 0 -
这是我最终要寻找的,尽管交叉表中的值为#/nrow
以获得相应的百分比值。我不确定我是否会以错误的方式解决这个问题,但任何意见都会受到赞赏
答案 0 :(得分:2)
您可以尝试:
Cmbn <- combn(seq_along(data),2)
nm1 <- apply(Cmbn, 2, paste, collapse="|")
f1 <- setNames(
apply(Cmbn, 2, function(x) {
x1 <- sign(data[,x[1]]- data[,x[2]])
table(factor(x1, levels=0, labels="Fr")) #not sure why you wanted a label "Fr" as it didn't appear in the results
}),
nm1)
f1
#1|2 1|3 2|3
#0 10 0
names1 <- paste("V", 1:3, sep=".")
m1 <- matrix(0, 3,3, dimnames=list(names1, names1))
m1[paste(col(m1), row(m1), sep="|") %in% names(f1)] <- f1
d1 <- as.data.frame(m1)
d1[upper.tri(d1, diag=TRUE)] <- "-"
d1
# V.1 V.2 V.3
#V.1 - - -
#V.2 0 - -
#V.3 10 0 -