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 / 79342732
Accepted
Joe
Joe
Asked: 2025-01-09 21:13:19 +0800 CST2025-01-09 21:13:19 +0800 CST 2025-01-09 21:13:19 +0800 CST

Percorrendo um quadro de dados enquanto agrupa linhas

  • 772

Desejo percorrer meu quadro de dados e alterar o valor de uma das células para evitar duplicatas.

myDf
name     day        score
joe      monday     16
joe      monday     16
harry    wednesday  88
harry    thursday   55
james    tuesday    10
will     monday     10
harry    wednesday  88
joe      tuesday    16
joe      monday     16

Aqui tenho linhas duplicadas, então para torná-las únicas e manter os dados, desejo colar o número da tentativa após a pontuação, assim:

mydf_new
name      day        score
joe      monday     16 (a1)
joe      monday     16 (a2)
harry    wednesday  88 (a1)
harry    thursday   55
james    tuesday    10
will     monday     10
harry    wednesday  88 (a2)
joe      tuesday    16
joe      monday     16 (a3)

O principal problema que estou tendo é como fazer um loop pelos meus dados e agrupar todas as linhas que não são únicas. Consegui identificá-las usando, dupSax = sax = which(duplicated(c(paste(myDf$name, myDf$day, myDf$score)))|duplicated(c(paste(myDf$name, myDf$day, myDf$score)), fromLast = TRUE))mas quando faço meu loop, não tenho certeza de como pegar todas as linhas que se relacionam em vez de linha por linha. Também entendo que essa pode não ser a maneira mais fácil de fazer isso.

  • 3 3 respostas
  • 73 Views

3 respostas

  • Voted
  1. Best Answer
    Ronak Shah
    2025-01-09T21:19:27+08:002025-01-09T21:19:27+08:00

    Criei uma nova coluna ( identifier) para a saída para que a coluna original scorenão seja alterada.

    Podemos agrupar os dados por namee day, se o número de linhas em um grupo for maior que 1, criamos uma sequência a1e a2a colamos com scorevalor.

    library(dplyr)
    
    mydf |>
      mutate(identifier = if(n() > 1) paste0(score, " (a", row_number(), ")") 
             else as.character(score), .by = c(name, day))
    
    #   name       day score identifier
    #1   joe    monday    16    16 (a1)
    #2   joe    monday    16    16 (a2)
    #3 harry wednesday    88    88 (a1)
    #4 harry  thursday    55         55
    #5 james   tuesday    10         10
    #6  will    monday    10         10
    #7 harry wednesday    88    88 (a2)
    #8   joe   tuesday    16         16
    #9   joe    monday    16    16 (a3)
    

    e a mesma lógica traduzida na base R:

    transform(mydf, identifier = ave(score, name, day, FUN = \(x) 
                    if(length(x) > 1) paste0(x, " (a", seq_along(x), ")") else x))
    
    • 2
  2. Roland
    2025-01-09T21:25:58+08:002025-01-09T21:25:58+08:00

    Sua saída proposta parece muito abaixo do ideal. Eu faria algo assim:

    library(data.table)
    DT <- fread("myDf
    name     day        score
    joe      monday     16
    joe      monday     16
    harry    wednesday  88
    harry    thursday   55
    james    tuesday    10
    will     monday     10
    harry    wednesday  88
    joe      tuesday    16
    joe      monday     16")
    
    #setDT(DT) #if data is in a data.frame
    
    DT[, attempt := seq_len(.N), by = .(name, day)]
    setorder(DT, name, day, attempt)
    print(DT)
    #     name       day score attempt
    #   <char>    <char> <int>   <int>
    #1:  harry  thursday    55       1
    #2:  harry wednesday    88       1
    #3:  harry wednesday    88       2
    #4:  james   tuesday    10       1
    #5:    joe    monday    16       1
    #6:    joe    monday    16       2
    #7:    joe    monday    16       3
    #8:    joe   tuesday    16       1
    #9:   will    monday    10       1
    
    • 2
  3. Andre Wildberg
    2025-01-09T22:19:08+08:002025-01-09T22:19:08+08:00

    Torne as linhas únicas combinando o ID do grupo e uma numeração consecutiva

    library(dplyr)
    
    myDf %>% 
      mutate(grp = paste0(cur_group_id(), "_", row_number()), .by = c(name, day))
    

    saída

       name       day score grp
    1   joe    monday    16 1_1
    2   joe    monday    16 1_2
    3 harry wednesday    88 2_1
    4 harry  thursday    55 3_1
    5 james   tuesday    10 4_1
    6  will    monday    10 5_1
    7 harry wednesday    88 2_2
    8   joe   tuesday    16 6_1
    9   joe    monday    16 1_3
    
    • 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

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

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

    • 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

    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
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +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

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