【发布时间】:2016-11-08 16:24:23
【问题描述】:
我正在使用 R 应用一个自编写的函数,该函数将两个数字向量和一个数字参数作为输入,位于数据框的列边距上。数据框中的每一列都是一个数字向量,我想执行成对计算并创建一个矩阵,该矩阵具有列的所有可能组合以及指示的计算结果。所以本质上我想产生一种类似于cor()函数产生的行为。
# Data
> head(d)
1 2 3 4
1 -1.01035342 1.2490665 0.7202516 0.101467379
2 -0.50700743 1.4356733 0.9032172 -0.001583743
3 -0.09055243 0.4695046 2.4487632 -1.082570048
4 1.11230416 0.2885735 0.3534247 -0.728574628
5 -1.96115691 0.4831158 1.5650052 0.648675605
6 1.20434218 1.7668086 0.2170858 -0.161570792
> cor(d)
1 2 3 4
1 1.00000000 0.08320968 -0.06432155 0.04909430
2 0.08320968 1.00000000 -0.04557743 -0.01092765
3 -0.06432155 -0.04557743 1.00000000 -0.01654762
4 0.04909430 -0.01092765 -0.01654762 1.00000000
我找到了这个有用的答案:Perform pairwise comparison of matrix
基于此我写了这个函数,它利用了另一个自写的函数compareFunctions()
createProbOfNonEqMatrix <- function(df,threshold){
combinations <- combn(ncol(df),2)
predDF <- matrix(nrow = length(density(df[,1])$y)) # df creation for predicted values from density function
for(i in 1:ncol(df)){
predCol <- density(df[,i])$y # convert df of original values to df of predicted values from density function
predDF <- cbind(predDF,predCol)
}
predDF <- predDF[,2:ncol(predDF)]
colnames(predDF) <- colnames(df) # give the predicted values column names as in the original df
predDF <- as.matrix(predDF)
out.mx <- apply( X=combinations,MARGIN = 2,FUN = "compareFunctions",
predicted_by_first = predDF[,combinations[1]],
predicted_by_second = predDF[,combinations[2]],
threshold = threshold)
return(out.mx)
}
predicted_by_first、predicted_by_second 和 threshold 是 compareFunctions 的输入。但是我收到以下错误:
Error in FUN(newX[, i], ...) : unused argument (newX[, i])
无奈之下,我尝试了这个:
createProbOfNonEqMatrix <- function(df,threshold){
combinations <- combn(ncol(df),2)
predDF <- matrix(nrow = length(density(df[,1])$y))
for(i in 1:ncol(df)){
predCol <- density(df[,i])$y
predDF <- cbind(predDF,predCol)
}
predDF <- predDF[,2:ncol(predDF)]
colnames(predDF) <- colnames(df)
predDF <- as.matrix(predDF)
out.mx <- apply(
X=combinations,MARGIN = 2,FUN = function(x) {
diff <- abs(predDF[,x[1]]-predDF[,x[2]])
boolean <- diff<threshold
acceptCount <- length(boolean[boolean==TRUE])
probability <- acceptCount/length(diff)
return(probability)
}
)
return(out.mx)
}
它似乎确实有效,但它没有返回成对矩阵,而是给了我一个向量:
> createProbOfNonEqMatrix(d,0.001)
[1] 0.10351562 0.08203125 0.13476562 0.13085938 0.14843750 0.10937500
您能否指导我如何制作所需的成对矩阵,即使这意味着在apply() 中再次编写函数代码?此外,如果您能给我一个关于如何跟踪执行的成对比较的想法,我们将不胜感激。
谢谢,
亚历克斯
【问题讨论】:
-
您可能想查看 proxy 包,它使您能够定义自己的自定义函数(如距离函数)并输出矩阵。 stackoverflow.com/a/7484202/2140956
标签: r