AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78993707
Accepted
Paolo Lorenzini
Paolo Lorenzini
Asked: 2024-09-17 18:51:40 +0800 CST2024-09-17 18:51:40 +0800 CST 2024-09-17 18:51:40 +0800 CST

preenchendo uma matriz por linhas

  • 772

Gostaria de preencher uma matriz por linha com base em uma função que fornece a seq() de um número seq(1) 1 seq(2) 1 2 e assim por diante

    matrixinp = matrix(data=NA, nrow=6, ncol=6) 

> print(matrixinp) 
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA
    
    # display matrix 
    print(matrixinp) 
    
    # fill the elements with some  
    # 90 in a matrix 
    for (i in 1:6){
      aaa<-seq(i)
      print(aaa)
      for(j in 1:6){ 
        matrixinp[j,] = aaa
      } 
    }

Isso me deu isto:

> print(matrixinp)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    1    2    3
[2,]    1    2    3    1    2    3
[3,]    1    2    3    1    2    3
[4,]    1    2    3    1    2    3
[5,]    1    2    3    1    2    3
[6,]    1    2    3    1    2    3

mas eu gostaria disto:

> print(matrixinp)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    NA   NA   NA   NA   NA
[2,]    1    2    NA   NA   NA   NA
[3,]    1    2    3    NA   NA   NA
[4,]    1    2    3    4    NA   NA
[5,]    1    2    3    4    5    NA
[6,]    1    2    3    4    5    6
  • 7 7 respostas
  • 80 Views

7 respostas

  • Voted
  1. Best Answer
    Rui Barradas
    2024-09-17T19:00:26+08:002024-09-17T19:00:26+08:00

    Aposto que uma linha pode resolver isso, R é uma linguagem vetorizada.

    matrixinp <- matrix(data=NA, nrow=6, ncol=6)
    matrixinp[lower.tri(matrixinp, diag = TRUE)] <- rep(1:6, 6:1)
    
    matrixinp
    #>      [,1] [,2] [,3] [,4] [,5] [,6]
    #> [1,]    1   NA   NA   NA   NA   NA
    #> [2,]    1    2   NA   NA   NA   NA
    #> [3,]    1    2    3   NA   NA   NA
    #> [4,]    1    2    3    4   NA   NA
    #> [5,]    1    2    3    4    5   NA
    #> [6,]    1    2    3    4    5    6
    

    Criado em 2024-09-17 com reprex v2.1.0

    Espere, eu ganhei a aposta.
    O truque é saber que as matrizes de R são colunas principais, portanto, com a matriz de índice, lower.trios valores irão para os lugares certos.

    • 6
  2. jblood94
    2024-09-17T19:53:25+08:002024-09-17T19:53:25+08:00

    Como uma função:

    f <- function(n) `dim<-`(rep(rbind(NA, 1:n), rbind(0:(n - 1), n:1)), c(n, n))
    f(6)
    #>      [,1] [,2] [,3] [,4] [,5] [,6]
    #> [1,]    1   NA   NA   NA   NA   NA
    #> [2,]    1    2   NA   NA   NA   NA
    #> [3,]    1    2    3   NA   NA   NA
    #> [4,]    1    2    3    4   NA   NA
    #> [5,]    1    2    3    4    5   NA
    #> [6,]    1    2    3    4    5    6
    f(10)
    #>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    #>  [1,]    1   NA   NA   NA   NA   NA   NA   NA   NA    NA
    #>  [2,]    1    2   NA   NA   NA   NA   NA   NA   NA    NA
    #>  [3,]    1    2    3   NA   NA   NA   NA   NA   NA    NA
    #>  [4,]    1    2    3    4   NA   NA   NA   NA   NA    NA
    #>  [5,]    1    2    3    4    5   NA   NA   NA   NA    NA
    #>  [6,]    1    2    3    4    5    6   NA   NA   NA    NA
    #>  [7,]    1    2    3    4    5    6    7   NA   NA    NA
    #>  [8,]    1    2    3    4    5    6    7    8   NA    NA
    #>  [9,]    1    2    3    4    5    6    7    8    9    NA
    #> [10,]    1    2    3    4    5    6    7    8    9    10
    
    • 4
  3. ThomasIsCoding
    2024-09-17T19:16:37+08:002024-09-17T19:16:37+08:00

    Você pode tentar

    > replace(m <- diag(1:6) * NA, lower.tri(m, TRUE), rep(1:6, 6:1))
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1   NA   NA   NA   NA   NA
    [2,]    1    2   NA   NA   NA   NA
    [3,]    1    2    3   NA   NA   NA
    [4,]    1    2    3    4   NA   NA
    [5,]    1    2    3    4    5   NA
    [6,]    1    2    3    4    5    6
    

    onde

    • diag(1:6)*NAproduz uma 6-by-6matriz de NAs
    • lower.trirecupera a parte triangular inferior dem
    • replacesubstitui os valores mde acordo com o indicador de máscara

    Ou, se você quiser manipulações por linha

    > do.call(rbind, lapply(1:6, \(k) `length<-`(seq.int(k), 6)))
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1   NA   NA   NA   NA   NA
    [2,]    1    2   NA   NA   NA   NA
    [3,]    1    2    3   NA   NA   NA
    [4,]    1    2    3    4   NA   NA
    [5,]    1    2    3    4    5   NA
    [6,]    1    2    3    4    5    6
    

    onde

    • `length<-`define os comprimentos para o vetor fornecido
    • do.call(rbind, ...)empilha vetores na lista por linhas
    • 3
  4. G. Grothendieck
    2024-09-17T20:06:04+08:002024-09-17T20:06:04+08:00

    1) Crie uma matriz diagonal 6x6, preencha-a com os números das colunas e então extraia o triângulo superior.

    library(magrittr)
    diag(6) %>% col() %>% { ifelse(row(.) < ., NA, .) }
    

    dando

         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1   NA   NA   NA   NA   NA
    [2,]    1    2   NA   NA   NA   NA
    [3,]    1    2    3   NA   NA   NA
    [4,]    1    2    3    4   NA   NA
    [5,]    1    2    3    4    5   NA
    [6,]    1    2    3    4    5    6
    

    2) ou com o cachimbo nativo:

    diag(6) |> col() |> list(x = _) |> with(ifelse(row(x) < x, NA, x))
    

    3) Defina cc como uma matriz 6x6 com números de colunas como acima e então use a fórmula mostrada.

    cc <- col(diag(6))
    cc * NA ^ (cc > t(cc))
    
    • 3
  5. Arka Ghosh
    2024-09-17T19:06:03+08:002024-09-17T19:06:03+08:00

    Você pode tentar o seguinte,

    # Create an empty 6x6 matrix
    matrixinp <- matrix(data=NA, nrow=6, ncol=6)
    
    # Fill the matrix row by row
    for (i in 1:6) {
      matrixinp[i, 1:i] <- seq(i)
    }
    
    # Display the matrix
    print(matrixinp)
    

    Mantenha a criação inicial da matriz vazia com valores NA. Use um único loop que itere sobre as linhas (1 a 6). Para cada linha i, preenchemos apenas as primeiras i colunas com a sequência seq(i). O restante dos elementos em cada linha permanece NA como definido inicialmente.

    Este método garante que cada linha tenha a sequência até seu número de linha, e o restante das partes permaneçam como NA.

    • 2
  6. TiredSquirrel
    2024-09-17T19:03:36+08:002024-09-17T19:03:36+08:00

    Você precisa fazer isso especificamente com um loop e seq()?

    Você poderia criar essa matriz muito facilmente com as habilidades de álgebra matricial do R:

    # Multiply a row vector of all 1s by a column vector of 1-6
    matrixinp <- rep(1,6) %*% t(1:6)
    
    # You have a matrix with an all-1s column, and all-2s column, etc. - now set the upper triangle to NA
    matrixinp[upper.tri(matrixinp)] <- NA
    

    Mas se você quiser entender por que seu loop não estava funcionando:

        for (i in 1:6){
          aaa<-seq(i)
          print(aaa)
          for(j in 1:6){ 
            matrixinp[j,] = aaa
          } 
        }
    

    Quando você executa, seq(4)obtém um vetor de comprimento 4 c(1,2,3,4). Você então tenta atribuí-lo a cada linha de matrixinp, mas as linhas naquela matriz têm 6 elementos de comprimento. Essa atribuição falhará com o erro number of items to replace is not a multiple of replacement lengthquando você chegar à 4ª iteração do loop.

    Antes de chegar à 4ª iteração, 6 é um múltiplo de 1, 2 e 3, então, para essas iterações, R preenche a matriz com repetições do seu vetor aaa:

    • Quando i=1, aaa=1, ele preenche as linhas da matriz com c(1,1,1,1,1,1).
    • Quando i=2, aaa=c(1,2)ele preenche as linhas da matriz com c(1,2,1,2,1,2).
    • Quando i=3, aaa=c(1,2,3), ele preenche as linhas da matriz com c(1,2,3,1,2,3).
    • Quando i=4, ele para com um erro em vez de preencher a matriz.

    É por isso que você tem aquela matriz estranha onde cada linha era 1 2 3 1 2 3 - quando i=3, o loop interno com j atribuído c(1,2,3,1,2,3)a cada linha da matriz. Então seu loop parou quando encontrou um erro em i=4, deixando você com a versão i=3 da matriz.

    • 1
  7. TiredSquirrel
    2024-09-17T20:08:25+08:002024-09-17T20:08:25+08:00

    Para ajudar o autor da pergunta original a entender, aqui está a frase que escrevi no meu comentário para RuiBarradas:

    matrixinp <- ifelse(lower.tri(matrix(nrow=6,ncol=6),diag=T),rep(1,6) %*% t(1:6),NA)
    

    Este é um código bagunçado e excessivamente complicado por ser bobo e tentar fazer tudo em uma linha. Você geralmente não deve fazer algo assim em código real, pois tornará o código difícil para outras pessoas lerem (ou para você ler quando olhar para ele novamente meses depois). Mas ele demonstra alguns recursos úteis do R, e brincar com coisas assim pode às vezes ajudar a aprender mais sobre R.

    Este código é melhor lido de fora para dentro, por exemplo, começando com a função mais externa:

    • ifelse()é uma função que verifica se seu primeiro argumento é verdadeiro - se for, ela retorna seu segundo argumento, caso contrário, ela retorna seu terceiro argumento.
      • Então ifelse(c(T,F,T,F),'A','B')retornaria c('A','B','A','B').
    • O primeiro argumento que dei ifelse()foi lower.tri(matrix(nrow=6,ncol=6),diag=T), uma matriz de valores VERDADEIRO/FALSO indicando quais células em uma matriz 6x6 estão no triângulo inferior (incluindo a diagonal como "no triângulo inferior")
    • O segundo argumento que dei foi rep(1,6) %*% t(1:6)a álgebra matricial da minha outra resposta à sua pergunta, que cria uma matriz com uma coluna só de 1, uma coluna só de 2, etc.
      • Esta parte na verdade é uma boa maneira de fazer uma matriz com 1 coluna, 2 colunas, etc. em R, eu não estava sendo bobo com isso. R é otimizado para fazer álgebra matricial muito, muito rápido, então uma solução de álgebra matricial é frequentemente a mais rápida.
    • O terceiro argumento que dei foi NA

    Então, esse código verifica para cada célula de uma matriz 6x6 se essa célula está no triângulo inferior. Se estiver, ele pega um valor para essa célula da matriz com uma coluna all-1s, all-2s, etc. Mas se estiver no triângulo superior, ele define essa célula como NA.

    E minha segunda frase de efeito:(!upper.tri(diag(6)) | NA) * (rep(1,6) %*% t(1:6))

    • Novamente, este é um código bobo, não faça isso de verdade
    • Para entender isso, divida-o em partes - é a multiplicação elemento a elemento de duas matrizes, uma criada por (!upper.tri(diag(6)) | NA)e outra por(rep(1,6) %*% t(1:6))
    • A matriz da esquerda usa a abordagem de R para manipulação e/ou lógica para criar uma matriz que é VERDADEIRA no triângulo inferior e NA no triângulo superior.
      • diag(6)cria uma matriz 6x6 que tem 1s nas diagonais e 0s em todos os outros lugares. Seu propósito é apenas criar uma matriz 6x6 de uma forma que seja mais curta de escrever do que matrix(nrow=6,ncol=6).
      • !upper.tri(diag(6))usa upper.tri()naquela matriz para criar uma matriz onde o triângulo superior (excluindo a diagonal) é TRUE e o triângulo inferior é FALSE. Então ele usa !(o operador "not") para transformar TRUEs em falses e vice-versa.
        • Eu também poderia ter escrito lower.tri(diag(6),diag=T)para fazer a mesma matriz V/F, mas como isso requer que a diag=Tmatriz inclua a diagonal, é mais curto (embora menos legível) para escrever !upper.tri(diag(6)).
      • Por fim, toda a matriz esquerda: (!upper.tri(diag(6)) | NA). Pego essa matriz V/F e faço um "ou" lógico com NA. "verdadeiro ou NA" é avaliado como "verdadeiro", enquanto "falso ou NA" é avaliado como NA.
    • A matriz à esquerda é a mesma abordagem baseada em álgebra matricial que usei em minhas outras respostas, que cria a matriz com uma coluna só de 1, uma coluna só de 2, etc.
    • Quando multiplico por elementos a matriz de trues e NAs pela matriz com todas as colunas X, o R converte o valor TRUE para 1 (ele também converteria o valor FALSE para 0 se houvesse algum FALSE presente). Então, para a metade inferior, multiplico 1*1, 1*2, 1*3, etc. Para a metade superior, estou multiplicando NAs, NA*1, NA*2, etc., o que produz NA como resultado.
    • -1

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve