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 / 77495644
Accepted
user2380782
user2380782
Asked: 2023-11-16 22:28:02 +0800 CST2023-11-16 22:28:02 +0800 CST 2023-11-16 22:28:02 +0800 CST

alternar valores de coluna no dataframe em R com base na combinação de duas colunas

  • 772

Tenho uma dúvida sobre como alterar os valores dos caracteres em um data.frame de acordo com combinações baseadas em duas colunas. Vou tentar dar um exemplo de como fica o data.frame

data <- data.frame(A1 = c("A", "T", "C"), A2 = c("C", "G", "T"), 
                   Ind1 = c("AA", "TG", "TT"), Ind2 = c("CA", "GT", "CT"),
                   Ind3 = c("AC", "GG", "TC"))

> data
  A1 A2 Ind1 Ind2 Ind3
1  A  C   AA   CA   AC
2  T  G   TG   GT   GG
3  C  T   TT   CT   TC

Quero alterar os valores nas colunas de Ind1 para Ind3 que não correspondem às combinações possíveis das colunas A1e A2, por exemplo, na primeira linha, A1é um Ae A2é um, Centão as combinações possíveis seriam AA, AC, CC(combinação baseada em A1, e A2naquela ordem). Portanto, o Ind2 deveria ser ACem vez de CA.

A saída desejada seria esta:

> data
  A1 A2 Ind1 Ind2 Ind3
1  A  C   AA   AC   AC
2  T  G   TG   TG   GG
3  C  T   TT   CT   CT

Eu tentei com switchmas não funciona. Qualquer ajuda seria apreciada. Obrigado

  • 3 3 respostas
  • 54 Views

3 respostas

  • Voted
  1. Best Answer
    Peter
    2023-11-16T22:40:59+08:002023-11-16T22:40:59+08:00

    Se entendi a pergunta corretamente e supondo que você tenha apenas duas cartas para lidar, há apenas um caso que precisará ser editado; é quando as letras estão na ordem inversa, ou seja, 'A2A1'. Todos os outros casos estarão corretos. Então você poderia gerenciar isso com uma simples ifelsemutação.

    data <- data.frame(A1 = c("A", "T", "C"), A2 = c("C", "G", "T"), 
                       Ind1 = c("AA", "TG", "TT"), Ind2 = c("CA", "GT", "CT"),
                       Ind3 = c("AC", "GG", "TC"))
    
    library(dplyr)
    
    data |> 
      mutate(across(starts_with("Ind"), ~ ifelse(.x == paste0(A2, A1), paste0(A1, A2), .x)))
    #>   A1 A2 Ind1 Ind2 Ind3
    #> 1  A  C   AA   AC   AC
    #> 2  T  G   TG   TG   GG
    #> 3  C  T   TT   CT   CT
    

    Em resposta aos comentários do OP, usando dados "reais":

    
    df2 <- structure(list(chr = "chr11", pos = "74565122", snp_id = "chr11_74565122_C_T_b38",     Allele1 = "C", Allele2 = "T", GTEX_111CU = "TT", GTEX_111YS = "CT",     GTEX_1122O = "TC", GTEX_117XS = "TC", GTEX_117YX = "TC"), class = "data.frame", row.names = c(NA, -1L))
    
    df2
    #>     chr      pos                 snp_id Allele1 Allele2 GTEX_111CU GTEX_111YS
    #> 1 chr11 74565122 chr11_74565122_C_T_b38       C       T         TT         CT
    #>   GTEX_1122O GTEX_117XS GTEX_117YX
    #> 1         TC         TC         TC
    
    mutate(df2, across(starts_with("GTEX"), ~ ifelse(.x %in% paste0(Allele2, Allele1), paste0(Allele1, Allele2), .x)))
    #>     chr      pos                 snp_id Allele1 Allele2 GTEX_111CU GTEX_111YS
    #> 1 chr11 74565122 chr11_74565122_C_T_b38       C       T         TT         CT
    #>   GTEX_1122O GTEX_117XS GTEX_117YX
    #> 1         CT         CT         CT
    
    • 5
  2. Maël
    2023-11-16T22:44:04+08:002023-11-16T22:44:04+08:00

    Além do truque muito inteligente de Peter, se você quiser uma solução um pouco mais codificada na base R, você pode usar splitas strings linha por linha, sortde acordo com a ordem em A1 e A2, e pastevice-versa. Isso é independente do número de letras a serem solicitadas:

    cols <- grep("Ind", colnames(data))
    data[cols] <- 
      apply(data, 1, \(x){
        strsplit(x[cols], "") |> 
          sapply(\(y) factor(y, levels = x[-cols]) |> 
                   sort() |> 
                   paste(collapse = ""))
      })) |> 
      t()
    
    #   A1 A2 Ind1 Ind2 Ind3
    # 1  A  C   AA   AC   AC
    # 2  T  G   TG   TG   GG
    # 3  C  T   TT   CT   CT
    
    • 3
  3. Gregor Thomas
    2023-11-16T22:46:32+08:002023-11-16T22:46:32+08:00

    Poderíamos usar um padrão regex para testar a validade do combo e depois reverter a string se ela não for válida:

    library(dplyr)
    library(stringr)
    data |>
      mutate(across(starts_with("Ind"), \(x) ifelse(
        str_detect(x, pattern = sprintf("^%s{0,2}%s{0,2}$", A1, A2)),
        x,
        stringi::stri_reverse(x))
      ))
    #   A1 A2 Ind1 Ind2 Ind3
    # 1  A  C   AA   AC   AC
    # 2  T  G   TG   TG   GG
    # 3  C  T   TT   CT   CT
    
    • 3

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

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

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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