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 / 79030031
Accepted
user1675107
user1675107
Asked: 2024-09-27 14:06:11 +0800 CST2024-09-27 14:06:11 +0800 CST 2024-09-27 14:06:11 +0800 CST

Existe uma função R para parear elementos de duas colunas de um data.frame para criar um novo data.frame

  • 772

Tenho vários milhares de linhas como esta armazenadas em um objeto em R. Quero criar um novo df2 pareando elementos de duas colunas ($exonStarts e $exonEnds) do df abaixo

df <- structure(list(bin = c(0L, 0L, 0L, 0L, 0L, 0L), name = c("XM_011541469.2", 
"XM_017001276.2", "XM_011541467.2", "NM_001276352.2", "NM_001276351.2", 
"XM_011541465.3"), chr = c("chr1", "chr1", "chr1", "chr1", "chr1", 
"chr1"), strand = c("-", "-", "-", "-", "-", "-"), txStart = c(67092164L, 
67092164L, 67092164L, 67092164L, 67092164L, 67092164L), txEnd = c(67109072L, 
67131227L, 67131227L, 67134970L, 67134970L, 67134970L), cdsStart = c(67093004L, 
67093004L, 67093004L, 67093579L, 67093004L, 67093004L), cdsEnd = c(67103382L, 
67127240L, 67127240L, 67127240L, 67127240L, 67127240L), exonCount = c(5L, 
9L, 9L, 9L, 8L, 9L), exonStarts = c("67092164,67095234,67096251,67103237,67109028,", 
"67092164,67095234,67096251,67103237,67111576,67115351,67125751,67127165,67131141,", 
"67092164,67095234,67096251,67103237,67111576,67115351,67125751,67127165,67131141,", 
"67092164,67096251,67103237,67111576,67115351,67125751,67127165,67131141,67134929,", 
"67092164,67095234,67096251,67115351,67125751,67127165,67131141,67134929,", 
"67092164,67095234,67096251,67103237,67111576,67115351,67125751,67127165,67134929,"
), exonEnds = c("67093604,67095421,67096321,67103382,67109072,", 
"67093604,67095421,67096321,67103382,67111644,67115464,67125909,67127257,67131227,", 
"67093604,67095421,67096321,67103343,67111644,67115464,67125909,67127257,67131227,", 
"67093604,67096321,67103382,67111644,67115464,67125909,67127257,67131227,67134970,", 
"67093604,67095421,67096321,67115464,67125909,67127257,67131227,67134970,", 
"67093604,67095421,67096321,67103382,67111644,67115464,67125909,67127257,67134970,"
), score = c(0L, 0L, 0L, 0L, 0L, 0L), gene = c("C1orf141", "C1orf141", 
"C1orf141", "C1orf141", "C1orf141", "C1orf141"), cdsStartStat = c("cmpl", 
"cmpl", "cmpl", "cmpl", "cmpl", "cmpl"), cdsEndStat = c("cmpl", 
"cmpl", "cmpl", "cmpl", "cmpl", "cmpl"), exonFrames = c("0,2,1,0,-1,", 
"0,2,1,0,1,2,0,0,-1,", "0,2,1,0,1,2,0,0,-1,", "2,1,0,1,2,0,0,-1,-1,", 
"0,2,1,2,0,0,-1,-1,", "0,2,1,0,1,2,0,0,-1,")), row.names = c(NA, 
6L), class = "data.frame")
 

para produzir uma saída como abaixo. A primeira linha da entrada df deve produzir 5 linhas de df2 no ​​formato abaixo, pareando cada elemento de $exonStart com cada elemento de $exonEnd (as contagens de elementos serão idênticas e estão presentes na coluna $exonCount).

$chr    $exonStart  $exonEnd
chr1    67092164    67093604
chr1    67095234    67095421
chr1    67096251    67096321
chr1    67103237    67103382
chr1    67109028    67109072

Isso precisa iterar sobre todas as linhas de entrada df e todos os resultados combinados em df2. Então, no total, haveria sum(object$exonCount)linhas em df2.

Eu sei que haveria algum tipo de strsplitfunção aqui para dividir $exonStarts e $exonEnds e então combiná-los. Talvez uma applyfunção para fazer isso em todas as linhas? Eu tentei algo assim primeiro

map2(unlist(strsplit(df$exonStarts[1], ",")), unlist(strsplit(dft$exonEnds[1], ",")), c)

para produzir uma lista de elementos pareados

[[1]]
[1] "67092164" "67093604"

[[2]]
[1] "67095234" "67095421"

[[3]]
[1] "67096251" "67096321"

[[4]]
[1] "67103237" "67103382"

[[5]]
[1] "67109028" "67109072"

Mas não sei para onde ir a partir daqui. Qualquer ajuda seria apreciada.

  • 2 2 respostas
  • 69 Views

2 respostas

  • Voted
  1. Best Answer
    2024-09-27T14:26:10+08:002024-09-27T14:26:10+08:00

    Você pode usar separate_longer_delimdetidyr

    library(tidyr)
    library(dplyr)
    
    select(df, chr, exonStarts, exonEnds) %>%
      separate_longer_delim(c(exonStarts, exonEnds), delim=",")
    

    O que dá (mostrando apenas as 10 primeiras linhas):

        chr exonStarts exonEnds
    1  chr1   67092164 67093604
    2  chr1   67095234 67095421
    3  chr1   67096251 67096321
    4  chr1   67103237 67103382
    5  chr1   67109028 67109072
    6  chr1                    
    7  chr1   67092164 67093604
    8  chr1   67095234 67095421
    9  chr1   67096251 67096321
    10 chr1   67103237 67103382
    

    As linhas em branco são devidas às vírgulas finais nas colunas originais, que podem ser facilmente removidas usando filter. Se você fizer isso, verá que há 49 linhas restantes, o mesmo que sum(df$exonCount).


    Como @TarJae menciona, o número de itens em cada coluna deve ser igual, ou um erro resultará. Presumivelmente, você está confiante de que essa situação não é possível.

    df$exonEnds[1] <- "67093604,67095421,67096321,67103382,"
    
    select(df, chr, exonStarts, exonEnds) %>%
      separate_longer_delim(c(exonStarts, exonEnds), delim=",")
    
    #Error in `separate_longer_delim()`:
    #! In row 1, can't recycle input of size 6 to size 5.
    #Run `rlang::last_trace()` to see where the error occurred.
    

    Você também receberá um erro ao usar sua strsplitabordagem.

    • 2
  2. Friede
    2024-09-27T16:42:47+08:002024-09-27T16:42:47+08:00

    Na base R, podemos fazer

    f = \(chr, split, ...) {
      stopifnot(is.character(chr))
      l = strsplit(chr, split, ...)
      # caution, this pads NA's to the end, if shorter than max.
      l = lapply(l, `length<-`, max(lengths(l))) 
      unlist(l, recursive = FALSE, use.names = FALSE)
    }
    

    (Para outras aplicações precisamos modificar a última linha de f().)

    Aplicativo:

    > lapply(df[c("exonStarts", "exonEnds")], f, split = ",") |> 
    +   list2DF() |>
    +   head()
      exonStarts exonEnds
    1   67092164 67093604
    2   67095234 67095421
    3   67096251 67096321
    4   67103237 67103382
    5   67109028 67109072
    6       <NA>     <NA>
    

    Cuidado. Essa abordagem tem as desvantagens de preencher NAs até o final de uma linha"," dividida em - ou respectivamente se ela não tiver o comprimento máximo. Em outras palavras, ela fundamenta a forte suposição de que dados ausentes, se presentes, estão nas extremidades de cada linha . Contanto que você não carregue dados contendo tais informações, essa abordagem pode ser apropriada.exonStartsexonEnds


    Compactar:

    f = \(chr, split, ...) unlist(lapply(l <- strsplit(chr, split, ...), `length<-`, max(lengths(l))))
    list2DF(lapply(df[c("exonStarts", "exonEnds")], f, split = ","))
    
    • 2

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