Как убрать это за цикл - PullRequest
0 голосов
/ 04 ноября 2019

Источник программы:

gf <- c(2, 1, NA, 4, 5,
        4, 5, NA, 1, 2,
        3,NA, 1, NA, NA)

dim(gf) <- c(5,3)

    n = nrow(gf)
    r = ncol(gf)

    for (i in 1:r) {
        col <- gf[ ,i]
        if (FALSE %in% (c(1:n) == col[col])) {
          cat("Error (i):", i, "\n")
          break
        }
    }
    gf

Матрица представляет файл игры с колонкой на раунд. Если x встречает y в игре, то y встречает x в той же игре. Проверьте, соответствует ли избыточность в симметричной матрице.

    Matrix:
      [,1] [,2] [,3]
[1,]    2    4    3
[2,]    1    5   NA
[3,]   NA   NA    1
[4,]    4    1   NA
[5,]    5    2   NA

Как исключить цикл for и получить формулу чистой матрицы?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Если вы просто хотите запустить проверку по столбцу, вы можете использовать следующее:

apply(gf, 2, function(v) all(1:length(v) == v[v],na.rm = T))

, чтобы все столбцы, отвечающие вашим требованиям, можно было получить как

rs <- seq(r)[apply(gf, 2, function(v) all(1:length(v) == v[v],na.rm = T))]
0 голосов
/ 04 ноября 2019

Не уверен, что я полностью понял вашу проблему, но в любом случае преобразование вашего кода в вызов apply более или менее просто.

Что-то вроде этого даст вам имена столбцов, возвращая TRUE, если это так. ОК и ЛОЖЬ в противном случае.

sapply(as.data.frame(gf), function(x) sum(c(1:nrow(gf)) != x[x], na.rm=TRUE) == 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...