在 "for" 循环中引入两个字符串

Introduce two strings in a "for" loop

我有这个数据框:

a <- c(2,5,90,77,56,65,85,75,12,24,52,32)
b <- c(45,78,98,55,63,12,23,38,75,68,99,73)
c <- c(77,85,3,22,4,69,86,39,78,36,96,11)
d <- c(52,68,4,25,79,120,97,20,7,19,37,67)
e <- c(14,73,91,87,94,38,1,685,47,102,666,74)

df <- data.frame(a,b,c,d,e)

和这个脚本:

R <- Map(`+`, list(1:3), 0:9) 
cmin <- t(as.matrix(rep(NA, ncol(df)))) 

for (r in seq(R)) {
  for (f in seq(ncol(df))) {
    x <- df[R[[r]], f]
    y <- df[R[[r]], -f]
    dif_2 <- (x - y)^2
    cmin[f] <- which.min(colSums(dif_2))
  }
}

dif_3 <- as.matrix(dif_2[,cmin])
sq <- sqrt(dif_3)

如何将脚本的最后两行放入上面的“for”循环中?

感谢大家对我的帮助!

如果 'sq' 的输出应该是 vector

sq <- c()
for (r in seq(R)) {
  for (f in seq(ncol(df))) {
    x <- df[R[[r]], f]
    y <- df[R[[r]], -f]
    dif_2 <- (x - y)^2
    cmin[f] <- which.min(colSums(dif_2))
    dif_3 <- as.matrix(dif_2[,cmin[f]])
    sq <- c(sq, sqrt(dif_3))
  }
}

-输出

> sq
  [1]  12  68   1  31   5   7  25  17   1  25  17   1  31   5   7  68   1  10   5   7  32  17   1   3  17   1   3   5   7  32   8  22   7
 [34]   8  22   7   1   3  75   1   3  75   1  10  38  10  38  27  32  31  26  55  52   4  52  23  55  10  38  27  52   4   1  31  26  22
 [67]  52   4   1  23  55  12  31  26  22   4   1  36  57  63   1   4   1  36  51  11  19  27  84 610  12  55   5  63   1   3  63   1   3
[100]  12  55   5  84 610  35  55   5   5   1   3  32   1   3  32  55   5   5 610  35  78   5   5  15   3  32   3   3  32   3   5   5  15
[133]  28  34 567   5  15  35  32   3  62  12  44  21   5  15  35  34 567   1

如果应该是list

sq <- list()
for (r in seq(R)) {
  for (f in seq(ncol(df))) {
    x <- df[R[[r]], f]
    y <- df[R[[r]], -f]
    dif_2 <- (x - y)^2
    cmin[f] <- which.min(colSums(dif_2))
    dif_3 <- as.matrix(dif_2[,cmin[f]])
    sq <- c(sq, list(sqrt(dif_3)))
  }
}

sqmat <- do.call(cbind, sq)

如果我没理解错的话,您需要 R 中给出的每行索引的最小距离。下面的代码创建了两个数据结构,sq_list1sq_3d,它们存储相同的值,但其中一个是矩阵列表,另一个是具有第 3 个索引 1:length(R) 的 3d 数组。

sq_list <- replicate(length(R), 
                     matrix(nrow = length(R[[1]]), ncol = ncol(df)),
                     simplify = FALSE)
sq_3d <- replicate(length(R), 
                      matrix(nrow = length(R[[1]]), ncol = ncol(df)))

for (r in seq(R)) {
  for (f in seq(ncol(df))) {
    x <- df[R[[r]], f]
    y <- df[R[[r]], -f]
    dif_2 <- (x - y)^2
    cmin <- which.min(colSums(dif_2))
    dif_3 <- dif_2[, cmin]
    sq_list[[r]][, f] <- sqrt(dif_3)
    sq_3d[, f, r] <- sqrt(dif_3)
  }
}

# output not shown
sq_list
sq_3d

编辑

这看起来更简单。

faux <- function(r, df){
  sub_df <- df[r, ]
  sapply(seq(ncol(sub_df)), \(f){
    d <- (sub_df[, f] - sub_df[, -f])^2
    cmin <- which.min(colSums(d))
    sqrt(d[, cmin])
  })
}
sq_list2 <- lapply(R, faux, df = df)
identical(sq_list, sq_list2)
#[1] TRUE