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 / 79241928
Accepted
DeduciveR
DeduciveR
Asked: 2024-12-01 23:41:15 +0800 CST2024-12-01 23:41:15 +0800 CST 2024-12-01 23:41:15 +0800 CST

Como anexar o nome de um vetor de sublista como um elemento nomeado dentro do vetor

  • 772

Tenho uma lista que contém detalhes do tráfego da web.

No processo de retangularização das listas, gostaria de acrescentar um valor a cada vetor nas sublistas nomeadas, que é o nome real do vetor da sublista.

Se eu usar isso por exemplo:

test_list %>% 
  map_depth(2, \(x) append(x, names(x)))

... Acabo adicionando todos os nomes dos elementos do vetor, enquanto quero acrescentar um nome de elemento de "campaign_type" com o valor "manual_campaign" ou "google_ads_campaign", já que esses são os únicos 2 nomes para esses vetores de sublista.

Com sucesso, a primeira sublista teria estes elementos:

  • campanha_id: NA
  • nome_da_campanha: '(orgânico)'
  • ...
  • tática_de_marketing : NA
  • tipo_de_campanha: "campanha_manual"

Tenho usado purrre a mapfamília para retangularização, então tanto a base R quanto a base R tidyversesão bem-vindas.

Obrigado.

Dados Reprex:

test_list <- structure(list(list(manual_campaign = list(campaign_id = NA_character_, 
    campaign_name = "(organic)", source = "bing", medium = "organic", 
    term = "(not provided)", content = "(not set)", source_platform = NA_character_, 
    creative_format = NA_character_, marketing_tactic = NA_character_), 
    google_ads_campaign = list(NULL, NULL, NULL, NULL, NULL, 
        NULL)), list(manual_campaign = list(campaign_id = NA_character_, 
    campaign_name = "(referral)", source = "Google", medium = "My Campaign", 
    term = "(not set)", content = "(not set)", source_platform = NA_character_, 
    creative_format = NA_character_, marketing_tactic = NA_character_), 
    google_ads_campaign = list(customer_id = "1111", account_name = "My Account", 
        campaign_id = "2222", campaign_name = "My Campaign Name", 
        ad_group_id = "3333", ad_group_name = "My Adgroup"))))```

  • 4 4 respostas
  • 101 Views

4 respostas

  • Voted
  1. Best Answer
    Joris C.
    2024-12-02T15:54:39+08:002024-12-02T15:54:39+08:00

    Aqui está outra abordagem que permite incluir os nomes da lista de nós diretamente ao desaninhar a lista em um data.frame usando a opção how = "bind"no rrapply()pacote from rrapply(extensão de base rapply()):

    rrapply::rrapply(
      test_list, 
      condition = Negate(is.null),      ## skip NULLs
      how = "bind",                     ## bind to wide data.frame
      options = list(namecols = TRUE)   ## include list names
    )
    
    #>   L1                  L2 campaign_id    campaign_name source      medium
    #> 1  1     manual_campaign        <NA>        (organic)   bing     organic
    #> 2  2     manual_campaign        <NA>       (referral) Google My Campaign
    #> 3  2 google_ads_campaign        2222 My Campaign Name   <NA>        <NA>
    #>             term   content source_platform creative_format marketing_tactic
    #> 1 (not provided) (not set)            <NA>            <NA>             <NA>
    #> 2      (not set) (not set)            <NA>            <NA>             <NA>
    #> 3           <NA>      <NA>            <NA>            <NA>             <NA>
    #>   customer_id account_name ad_group_id ad_group_name
    #> 1        <NA>         <NA>        <NA>          <NA>
    #> 2        <NA>         <NA>        <NA>          <NA>
    #> 3        1111   My Account        3333    My Adgroup
    
    • 2
  2. SAL
    2024-12-02T06:39:44+08:002024-12-02T06:39:44+08:00

    Uma solução poderia ser usar map_deptho nível 1 e chamar mapplya função na lista aninhada para obter o que você pediu:

    test_list <-map_depth(test_list, 1, \(.x) mapply(\(x, y) {
      names(y)<-"campaign_type"
      c(x,y)
    }
    , x=.x
    , y=names(.x)
    , SIMPLIFY = FALSE)
    ) 
    

    Em seguida, vincular e colocar tudo no quadro de dados:

    new_dat<-test_list %>% 
      map_depth(2, vctrs::list_drop_empty) %>%
      map_depth(1,  bind_rows) %>%
      bind_rows(.id = "mainlist") %>% 
      relocate(campaign_type, .after = mainlist) 
    

    saída:

      mainlist       campaign_type campaign_id    campaign_name source      medium           term   content source_platform creative_format marketing_tactic customer_id account_name ad_group_id ad_group_name
    1        1     manual_campaign        <NA>        (organic)   bing     organic (not provided) (not set)            <NA>            <NA>             <NA>        <NA>         <NA>        <NA>          <NA>
    2        1 google_ads_campaign        <NA>             <NA>   <NA>        <NA>           <NA>      <NA>            <NA>            <NA>             <NA>        <NA>         <NA>        <NA>          <NA>
    3        2     manual_campaign        <NA>       (referral) Google My Campaign      (not set) (not set)            <NA>            <NA>             <NA>        <NA>         <NA>        <NA>          <NA>
    4        2 google_ads_campaign        2222 My Campaign Name   <NA>        <NA>           <NA>      <NA>            <NA>            <NA>             <NA>        1111   My Account        3333    My Adgroup
    

    Espero que isso possa ajudar, mas com certeza existem outras soluções também.

    • 1
  3. Friede
    2024-12-02T23:41:46+08:002024-12-02T23:41:46+08:00

    {collapse}é poderoso. unlist2d()tem um recursiveargumento - definido como TRUE(padrão).

    collapse::unlist2d(test_list, idcols = paste0("L", 1:3)) |>
      tidyr::pivot_wider(id_cols = L1:L2, names_from = L3, values_from = V1)
    
    # A tibble: 3 × 15
         L1 L2       campaign_id campaign_name source medium term  content source_platform creative_format marketing_tactic customer_id account_name ad_group_id ad_group_name
      <int> <chr>    <chr>       <chr>         <chr>  <chr>  <chr> <chr>   <chr>           <chr>           <chr>            <chr>       <chr>        <chr>       <chr>        
    1     1 manual_… NA          (organic)     bing   organ… (not… (not s… NA              NA              NA               NA          NA           NA          NA           
    2     2 manual_… NA          (referral)    Google My Ca… (not… (not s… NA              NA              NA               NA          NA           NA          NA           
    3     2 google_… 2222        My Campaign … NA     NA     NA    NA      NA              NA              NA               1111        My Account   3333        My Adgroup   
    

    Editar. O formato amplo pode não ser necessário.

    • 1
  4. Andre Wildberg
    2024-12-02T07:24:33+08:002024-12-02T07:24:33+08:00

    Obtendo os nomes genericamente extraindo os nomes de comprimento máximo de todas as sublistas

    nms <- data.frame(sapply(purrr::map_depth(test_list, 2, names), c)) %>% 
      mutate(id = row_number()) %>% 
      pivot_longer(-id) %>% 
      select(-name) %>% 
      slice(which.max(lengths(value)), .by = id) %>% 
      select(-id) %>% 
      c(use.names=F) %>% 
      unlist(recursive=F)
    

    Atribuindo os nomes pelos nomes de nível superior manual_campaign e google_ads_campaign

    new_list <- lapply(test_list, \(x) 
      sapply(names(x), \(y) {
        names(x[[y]]) <- nms[[y]]
        x[[y]]
      }))
    

    Finalmente substituindo NULLporque isso pode causar problemas ao tentar acessar os elementos

    new_list <- purrr::map_depth(new_list, 3, \(x) ifelse(length(x) == 0, NA, x))
    
    • 0

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