Copiar diferentes ranges de diferentes abas excel e extrair dados de lista de lista de df's

olá pessoal, vejam a minha dúvida abaixo, se alguém pode me ajudar:

  • fiz uma funcao com read_excel para copiar diferentes intervalos (ranges ) de diferentes abas de uma planilha. A funcao lista os arquivos xlsx da pasta e copia esses dados.
    eu passei os intervalos desejados , e as abas para serem copiadas para a função usando purrr::pmap

até que a ideia funcionou, mas minha dúvida é que o resultado é uma lista de listas de tbl_df ,
como juntar essas informações da lista com bind_rows e bind_cols?

abaixo o codigo usado:


setwd("C:/Users/aless/Dropbox/R_folder/bmk/teste purr afin")
library(tidyverse)
library(readxl)

aba = c('cadastro','questionário')

intervalo = c('G2:G9', 'E4:E170')

Le_arquivos = function(sheet,range) {
    
    temp = list.files(pattern = "*.xlsx")
    
    plan = temp %>% 
        map(read_excel, sheet, range)
}


#  gera lista de lista de df

df3 = pmap(list(aba,intervalo), Le_arquivos)

Created on 2021-01-24 by the reprex package (v0.3.0)

abaixo o resultado (df3):

image

o que eu desejo fazer:

1-fazer bind_rows do df [[1]] da lista [[1]] com df [[1]] da lista [[2]] e do df [[2]] da lista [[1]] com df [[2]] da lista [[2]] ,

pois os dados do df[[1]] na lista 1 e lista 2 são do mesmo cliente.

2 - fazer bind_cols do resultado gerado , ou seja em cada coluna terei dados de um cliente…

pensei uma solução que deu certo:


#  filtra as listas e faz primeiro o bind_cols

cadastro = dplyr::bind_cols( df3[1])
resposta = dplyr::bind_cols( df3[2])
#> New names:
#> * Resposta -> Resposta...1
#> * Resposta -> Resposta...2

# renomeia as colunas de resposta para conseguir fazer bind_rows
nomes <- names(cadastro)

resposta <- purrr::set_names(resposta,nomes)

# reune em um df cadastro e resposta
df_completo = dplyr::bind_rows(cadastro, resposta)

muito obrigado,
caso alguém tenha alguma sugestão, será bem vinda.

Obs: a ação de organizar as idéias para pedir ajuda já me ajudou a chegar na solução…

1 curtida

haha muito bom que o processo de pedir ajuda, ajuda a resolver!! (isso tem até nome, chama-se do procedimento “pato de borracha”)

Eu acho que sua solução tá bem legal, e de fato teriam 1000 maneiras igualmente certas! Eu fiz um codigozinho aqui improvisado pra fomentar a discussão, mas sem pretensões de mudar o que vc fez:

library(magrittr)
library(purrr)
library(dplyr)
df3 <- list(
    cadastro = list(
        cliente1 = iris[1:3, 1:4],
        cliente2 = mtcars[1:2, 1:3]
    ),
    resposta = list(
        cliente1 = iris[4:5, 1:4],
        cliente2 = mtcars[5:7, 1:3]
    )
)

# inverte: em vez de focar em um tipo de info pra todos os clientes,
# ele deixa um cliente com todas as suas infos.
lista_de_clientes <- transpose(df3)

# já que temos uma lista de clientes, agora vamos empilhar.
# a funcao bind_rows() já tá preparada pra receber uma lista!
transpose(df3) %>% map(bind_rows)
#> $cliente1
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3.0          1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5.0         3.6          1.4         0.2
#> 
#> $cliente2
#>                    mpg cyl disp
#> Mazda RX4         21.0   6  160
#> Mazda RX4 Wag     21.0   6  160
#> Hornet Sportabout 18.7   8  360
#> Valiant           18.1   6  225
#> Duster 360        14.3   8  360

Created on 2021-01-25 by the reprex package (v0.3.0)

1 curtida

Olá Athos, muito obrigado pelo comentário, achei muito interessante o procedimento pato de borracha :smile:

sua resposta me ajudou sobre o potencial da função transpose, mas como meu objetivo era chegar a um data frame, quando usei transpose(df3) %>% map(bind_rows), ele colocou a coluna resposta ao lado da coluna cadastro, e ela deve ser colocada abaixo.
colo aqui um exemplo de como deve ficar (vendo como são os dados melhora o entendimento):

de qualquer forma é muito Top esse grupo da Curso R!! podemos contar com pessoas de muito conhecimento

1 curtida