Как я могу узнать, сколько строк матрицы удовлетворяют довольно сложному критерию (в R)? - PullRequest
3 голосов
/ 23 мая 2010

В качестве примера, вот способ получить матрицу всех возможных результатов броска 4 (справедливых) костей.

z <- as.matrix(expand.grid(c(1:6),c(1:6),c(1:6),c(1:6)))

Как вы, возможно, уже поняли, я пытаюсь решить вопрос, который был закрыт , хотя, на мой взгляд, это сложный вопрос. Я использовал методы подсчета, чтобы решить ее (я имею в виду вручную), и я наконец пришел к ряду результатов, с суммой подмножества, равной 5, равной 1083 из 1296. Этот результат согласуется с ответами на этот вопрос прежде чем он был закрыт. Мне было интересно, как можно получить это подмножество результатов (скажем, z1, где dim (z1) = [1083,4]), используя R. У вас есть какие-нибудь идеи?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 мая 2010
sum(apply(z, 1, function(x) 5 %in% unlist(sapply(1:4, function(i) combn(x, i, sum)))))
1 голос
/ 23 мая 2010

Это работает для меня:

require(combinat)

# Returns the sums of all the possible subsets for a single combination
comb <- function(values)
    {
    sums <- NULL

    # Sum each combination of 1,2,... n-1 dice
    for (i in 1:(length(values)-1))
        {
        c <- combn(values, i)
        sums <- c(sums, colSums(c))
        }

    # Also sum all the dice
    sums <- c(sums, sum(values))

    comb <- sums
    }

# Returns TRUE if the array contains a certain value
hasVal <- function(values, n)
    {
    hasVal <- (length(which(values == n)) > 0)
    }

dice <- as.matrix(expand.grid(1:6, 1:6, 1:6, 1:6))
theSum <- 5

# Get the sums of all the subsets for each line
sums <- apply(z, 1, comb)
# See which columns of sums contain 5 
has5 <- apply(sums, 2, hasVal, theSum)
# Now count them :)
print(paste(length(which(has5 == TRUE)), " combinations over ", 
        length(has5), " have a subset that sums to ", theSum))

И выходы:

[1] "1083 комбинаций более 1296 имеют подмножество, равное 5"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...