gpt4 book ai didi

r - 通过将函数应用于 r 中所有可能的变量组合来生成矩阵

转载 作者:行者123 更新时间:2023-12-04 12:18:51 24 4
gpt4 key购买 nike

这是我的小数据集,这是一个函数:

dat <- data.frame (
A1 = c("AA", "AA", "AA", "AA"),
B1 = c("BB", "BB", "AB", "AB"),
C1 = c("AB", "BB", "AA", "AB"))

功能
syfun <- function (x, y){

if(x == "AA" & y == "AA" | x == "BB" & y == "BB"){
sxy = 1
}
if(x == "AA" & y == "AB" | x == "AB" & y == "AA"){
sxy = 0.5
}
if (x == "AA" & y == "BB"| x == "BB" & y == "AA"){
sxy = 0
}
return(sxy)
}

out <- rep (NA, NROW(dat))

for (i in 1:NROW(dat)){
out[i] <- syfun (dat[i,1], dat[i,1])
}

mean(out)
1

在这里,我想要做的是应用具有相同变量(变量 A1)的第一列(变量 A)的函数并平均输出值。我想将此输出保存到矩阵单元格中。

A1 和 B1 之间也类似。
   for (i in 1:NROW(dat)){
out[i] <- syfun (dat[i,1], dat[i,2])
}
mean(out)
0.25

现在类似于相关矩阵,我想保存变量之间的所有可能组合以制作一个矩阵。
         A1    B1    C1
A1 1.0 0.25 0.5
B1 0.25 1.0 NA
C1 0.5 NA 1.0

编辑:不产生 NA 的更完整的功能
syfun <- function (x, y){
sxy <- NA
if(x == "AA" & y == "AA" | x == "BB" & y == "BB"){
sxy = 1
}
if(x == "AA" & y == "AB" | x == "AB" & y == "AA"){
sxy = 0.5
}
if (x == "AA" & y == "BB"| x == "BB" & y == "AA"){
sxy = 0
}
if (x == "BB" & y == "AB"| x == "AB" & y == "BB"){
sxy = 0.5
}

if(x == "AB" & y == "AB") {
sxy = 0.5
}
return(sxy)
}

最佳答案

首先,你的函数syfun必须返回NA如果没有匹配。因此,我在函数顶部添加了一行:

syfun <- function (x, y){
sxy <- NA
if(x == "AA" & y == "AA" | x == "BB" & y == "AA"){
sxy = 1
}
if(x == "AA" & y == "AB" | x == "AB" & y == "AA"){
sxy = 0.5
}
if (x == "AA" & y == "BB"| x == "BB" & y == "AA"){
sxy = 0
}
return(sxy)
}

二、可以使用 outer将该函数应用于所有组合。您需要使用 Vectorize向量化函数:
mat <- outer(names(dat), names(dat), function(x, y) 
Vectorize(function(a, b) mean(Vectorize(syfun)(dat[[a]], dat[[b]])))(x,y))

第三,用 1替换对角线上的元素:
diag(mat) <- 1

四、设置行列名:
dimnames(mat) <- list(names(dat), names(dat))

结果:
     A1   B1  C1
A1 1.00 0.25 0.5
B1 0.25 1.00 NA
C1 0.50 NA 1.0

关于r - 通过将函数应用于 r 中所有可能的变量组合来生成矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22564306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com