ATIVIDADE 04 – Importação e Manipulação de Dados no R (Karen Maciel)

Objetivo

Este relatório apresenta, de forma objetiva, os principais conceitos de importação e manipulação de dados no R, com exemplos práticos reais a partir de uma planilha no Google Drive/Sheets.


1. Importação de dados

1.3 googlesheets4::read_sheet() – leitura do Google Drive/Sheets (automática)

# Descobre o tipo do arquivo no Drive e lê automaticamente:
# - Se for Google Sheets → read_sheet()
# - Se for Excel (.xlsx) no Drive → baixa e lê com readxl()

drv <- googledrive::drive_get(as_id(ss_id))
mime <- drv$drive_resource[[1]]$mimeType

if (grepl("google-apps.spreadsheet", mime)) {
  abas <- googlesheets4::sheet_names(ss_id)
  sheet_to_read <- if ("Base" %in% abas) "Base" else abas[1]
  dados <- googlesheets4::read_sheet(ss = ss_id, sheet = sheet_to_read)
} else if (grepl("openxmlformats-officedocument.spreadsheetml.sheet", mime)) {
  tmp <- tempfile(fileext = ".xlsx")
  googledrive::drive_download(as_id(ss_id), path = tmp, overwrite = TRUE)
  dados <- readxl::read_xlsx(path = tmp, sheet = 1)
} else {
  stop(paste0("O arquivo no Drive não é Google Sheets nem Excel .xlsx. Tipo: ", mime))
}

# Conferência
head(dados)
#> # A tibble: 6 × 12
#>   Mês        Estação Tamanho item  Quantidade necessári…¹ Quantidade que já te…²
#>   <chr>      <chr>   <chr>   <chr>                  <dbl>                  <dbl>
#> 1 Jan        Verão   RN      Bodi…                      4                      3
#> 2 Jan        Verão   RN      Maca…                      2                      2
#> 3 Jan        Verão   RN      Maca…                      3                      3
#> 4 jan        Verao   RN      Conj…                      1                      1
#> 5 <NA>       <NA>    <NA>    body…                      3                      3
#> 6 Jan – Fev… Verão   P       Bodi…                      6                      8
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>
str(dados)
#> tibble [49 × 12] (S3: tbl_df/tbl/data.frame)
#>  $ Mês                    : chr [1:49] "Jan" "Jan" "Jan" "jan" ...
#>  $ Estação                : chr [1:49] "Verão" "Verão" "Verão" "Verao" ...
#>  $ Tamanho                : chr [1:49] "RN" "RN" "RN" "RN" ...
#>  $ item                   : chr [1:49] "Bodies manga curta" "Macacões curtos" "Macacões longos" "Conjunto cardiga e calça" ...
#>  $ Quantidade necessária  : num [1:49] 4 2 3 1 3 6 4 2 3 4 ...
#>  $ Quantidade que já tenho: num [1:49] 3 2 3 1 3 8 4 2 5 6 ...
#>  $ Quantidade faltante    : num [1:49] 1 0 0 NA NA -2 0 0 -2 -2 ...
#>  $ ...8                   : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...9                   : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...10                  : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...11                  : chr [1:49] NA NA NA NA ...
#>  $ ...12                  : num [1:49] NA NA NA NA 0 0 0 0 0 0 ...

Observação: O código acima lida com os dois casos mais comuns (Sheets nativo e Excel armazenado no Drive) sem exigir autenticação.


1.2 readr::read_delim() – lê arquivos de texto (CSV, TSV)

# Salva os dados em CSV (garante pasta 'dados')
if (!dir.exists("dados")) dir.create("dados")
write_delim(dados, file = "dados/planilha.csv", delim = ",")

# Reimporta o CSV
dados_csv <- read_delim(file = "dados/planilha.csv", delim = ",")
head(dados_csv)
#> # A tibble: 6 × 12
#>   Mês        Estação Tamanho item  Quantidade necessári…¹ Quantidade que já te…²
#>   <chr>      <chr>   <chr>   <chr>                  <dbl>                  <dbl>
#> 1 Jan        Verão   RN      Bodi…                      4                      3
#> 2 Jan        Verão   RN      Maca…                      2                      2
#> 3 Jan        Verão   RN      Maca…                      3                      3
#> 4 jan        Verao   RN      Conj…                      1                      1
#> 5 <NA>       <NA>    <NA>    body…                      3                      3
#> 6 Jan – Fev… Verão   P       Bodi…                      6                      8
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>

Principais argumentos: file (caminho do arquivo texto) e delim (separador: ",", ";", "\\t").


1.1 readxl::read_xlsx() – lê planilhas Excel (.xlsx)

# Exemplo ilustrativo de leitura de Excel local:
# dados_excel <- read_xlsx(path = "dados/planilha.xlsx")
# head(dados_excel)

Argumento path: Caminho do arquivo Excel local (ex.: "dados/planilha.xlsx").


1.4 Resumo rápido dos argumentos path, file, delim, ss

Argumento Usado em Significado Exemplo
path read_xlsx() Caminho do arquivo local (Excel). "dados/planilha.xlsx"
file read_delim() Caminho do arquivo de texto (CSV/TSV). "dados/clientes.csv"
delim read_delim() Delimitador que separa colunas (, ; \\t). "," (CSV), ";" (BR), "\\t" (TSV)
ss read_sheet() ID/URL de planilha no Google Sheets (ou arquivo no Drive). "https://docs.google.com/spreadsheets/d/1I5BRKAlsRKUuu76_yunud6ZWSS_0bgAv"

2. Combinação de tabelas – rbind() e cbind()

amostra1 <- head(dados, 3)
amostra2 <- head(dados, 2)

unidas_linhas <- rbind(amostra1, amostra2)
aux <- data.frame(flag = rep("A", nrow(unidas_linhas)))
unidas_colunas <- cbind(unidas_linhas, aux)

list(rbind_exemplo = unidas_linhas, cbind_exemplo = unidas_colunas)
#> $rbind_exemplo
#> # A tibble: 5 × 12
#>   Mês   Estação Tamanho item       Quantidade necessári…¹ Quantidade que já te…²
#>   <chr> <chr>   <chr>   <chr>                       <dbl>                  <dbl>
#> 1 Jan   Verão   RN      Bodies ma…                      4                      3
#> 2 Jan   Verão   RN      Macacões …                      2                      2
#> 3 Jan   Verão   RN      Macacões …                      3                      3
#> 4 Jan   Verão   RN      Bodies ma…                      4                      3
#> 5 Jan   Verão   RN      Macacões …                      2                      2
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>
#> 
#> $cbind_exemplo
#>   Mês Estação Tamanho               item Quantidade necessária
#> 1 Jan   Verão      RN Bodies manga curta                     4
#> 2 Jan   Verão      RN    Macacões curtos                     2
#> 3 Jan   Verão      RN    Macacões longos                     3
#> 4 Jan   Verão      RN Bodies manga curta                     4
#> 5 Jan   Verão      RN    Macacões curtos                     2
#>   Quantidade que já tenho Quantidade faltante ...8 ...9 ...10 ...11 ...12 flag
#> 1                       3                   1   NA   NA    NA  <NA>    NA    A
#> 2                       2                   0   NA   NA    NA  <NA>    NA    A
#> 3                       3                   0   NA   NA    NA  <NA>    NA    A
#> 4                       3                   1   NA   NA    NA  <NA>    NA    A
#> 5                       2                   0   NA   NA    NA  <NA>    NA    A

3. Estrutura e dimensões dos dados

ncol(dados); nrow(dados); dim(dados)
#> [1] 12
#> [1] 49
#> [1] 49 12
head(dados, 3); tail(dados, 2)
#> # A tibble: 3 × 12
#>   Mês   Estação Tamanho item       Quantidade necessári…¹ Quantidade que já te…²
#>   <chr> <chr>   <chr>   <chr>                       <dbl>                  <dbl>
#> 1 Jan   Verão   RN      Bodies ma…                      4                      3
#> 2 Jan   Verão   RN      Macacões …                      2                      2
#> 3 Jan   Verão   RN      Macacões …                      3                      3
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>
#> # A tibble: 2 × 12
#>   Mês   Estação Tamanho item       Quantidade necessári…¹ Quantidade que já te…²
#>   <chr> <chr>   <chr>   <chr>                       <dbl>                  <dbl>
#> 1 <NA>  <NA>    <NA>    Saco de d…                      1                      1
#> 2 <NA>  <NA>    <NA>    Fraldas d…                      6                      6
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>
str(dados)
#> tibble [49 × 12] (S3: tbl_df/tbl/data.frame)
#>  $ Mês                    : chr [1:49] "Jan" "Jan" "Jan" "jan" ...
#>  $ Estação                : chr [1:49] "Verão" "Verão" "Verão" "Verao" ...
#>  $ Tamanho                : chr [1:49] "RN" "RN" "RN" "RN" ...
#>  $ item                   : chr [1:49] "Bodies manga curta" "Macacões curtos" "Macacões longos" "Conjunto cardiga e calça" ...
#>  $ Quantidade necessária  : num [1:49] 4 2 3 1 3 6 4 2 3 4 ...
#>  $ Quantidade que já tenho: num [1:49] 3 2 3 1 3 8 4 2 5 6 ...
#>  $ Quantidade faltante    : num [1:49] 1 0 0 NA NA -2 0 0 -2 -2 ...
#>  $ ...8                   : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...9                   : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...10                  : logi [1:49] NA NA NA NA NA NA ...
#>  $ ...11                  : chr [1:49] NA NA NA NA ...
#>  $ ...12                  : num [1:49] NA NA NA NA 0 0 0 0 0 0 ...

4. Seleção e subconjuntos

nomes <- names(dados); nomes
#>  [1] "Mês"                     "Estação"                
#>  [3] "Tamanho"                 "item"                   
#>  [5] "Quantidade necessária"   "Quantidade que já tenho"
#>  [7] "Quantidade faltante"     "...8"                   
#>  [9] "...9"                    "...10"                  
#> [11] "...11"                   "...12"
linhas_1a3  <- dados[1:3, ]
colunas_1e2 <- dados[, 1:min(2, ncol(dados))]

col1 <- nomes[1]
sel_por_nome <- dados[, col1, drop = FALSE]

num_cols <- names(Filter(is.numeric, dados))
if (length(num_cols) > 0) {
  col_num <- num_cols[1]
  med <- median(dados[[col_num]], na.rm = TRUE)
  subset_num <- dados[dados[[col_num]] > med, ]
  head(subset_num)
} else {
  "Sem colunas numéricas para filtrar neste exemplo."
}
#> # A tibble: 6 × 12
#>   Mês        Estação Tamanho item  Quantidade necessári…¹ Quantidade que já te…²
#>   <chr>      <chr>   <chr>   <chr>                  <dbl>                  <dbl>
#> 1 Jan – Fev… Verão   P       Bodi…                      6                      8
#> 2 Abr – Mai… Final … M       Bodi…                      8                      9
#> 3 Abr – Mai… Outono… G       Bodi…                      6                      5
#> 4 Abr – Mai… Outono… G       Calça                      6                      7
#> 5 Abr – Mai… Outono… G       Bodi…                      6                      8
#> 6 Jul - Ago… Invern… GG      Bodi…                      6                      7
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>

5. Funções estatísticas básicas

num_cols <- names(Filter(is.numeric, dados))
if (length(num_cols) > 0) {
  x <- dados[[ num_cols[1] ]]
  c(
    min = min(x, na.rm = TRUE),
    max = max(x, na.rm = TRUE),
    mean = mean(x, na.rm = TRUE),
    sd = sd(x, na.rm = TRUE),
    median = median(x, na.rm = TRUE),
    round_mean = round(mean(x, na.rm = TRUE), 1)
  )
} else {
  "Sem colunas numéricas — cálculos não aplicáveis."
}
#>        min        max       mean         sd     median round_mean 
#>   1.000000   8.000000   3.638298   1.660612   4.000000   3.600000

6. Comparações lógicas

class(dados[[1]]); Sys.Date()
#> [1] "character"
#> [1] "2025-10-28"
x <- 15
c(x > 10, x < 10, x == 15, x != 20, x >= 15, x <= 14)
#> [1]  TRUE FALSE  TRUE  TRUE  TRUE FALSE
valores <- c("A", "B")
valores %in% unlist(dados[1], use.names = FALSE)
#> [1] FALSE FALSE
c(!TRUE, !FALSE)
#> [1] FALSE  TRUE

7. Operadores compostos – E (&) e OU (|)

if (ncol(dados) >= 2) {
  c1 <- dados[[1]]
  cond1 <- if (is.numeric(c1)) c1 > stats::median(c1, na.rm = TRUE) else c1 == c1[1]

  c2 <- dados[[2]]
  cond2 <- if (is.numeric(c2)) c2 >= stats::median(c2, na.rm = TRUE) else c2 == c2[1]

  subset_E  <- dados[ cond1 & cond2, ]
  subset_OU <- dados[ cond1 | cond2, ]

  list(E = head(subset_E), OU = head(subset_OU))
} else {
  "Menos de 2 colunas — não é possível combinar condições."
}
#> $E
#> # A tibble: 6 × 12
#>   Mês   Estação Tamanho item       Quantidade necessári…¹ Quantidade que já te…²
#>   <chr> <chr>   <chr>   <chr>                       <dbl>                  <dbl>
#> 1 Jan   Verão   RN      Bodies ma…                      4                      3
#> 2 Jan   Verão   RN      Macacões …                      2                      2
#> 3 Jan   Verão   RN      Macacões …                      3                      3
#> 4 <NA>  <NA>    <NA>    <NA>                           NA                     NA
#> 5 <NA>  <NA>    <NA>    <NA>                           NA                     NA
#> 6 <NA>  <NA>    <NA>    <NA>                           NA                     NA
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>
#> 
#> $OU
#> # A tibble: 6 × 12
#>   Mês        Estação Tamanho item  Quantidade necessári…¹ Quantidade que já te…²
#>   <chr>      <chr>   <chr>   <chr>                  <dbl>                  <dbl>
#> 1 Jan        Verão   RN      Bodi…                      4                      3
#> 2 Jan        Verão   RN      Maca…                      2                      2
#> 3 Jan        Verão   RN      Maca…                      3                      3
#> 4 <NA>       <NA>    <NA>    <NA>                      NA                     NA
#> 5 Jan – Fev… Verão   P       Bodi…                      6                      8
#> 6 Jan – Fev… Verão   P       Maca…                      4                      4
#> # ℹ abbreviated names: ¹​`Quantidade necessária`, ²​`Quantidade que já tenho`
#> # ℹ 6 more variables: `Quantidade faltante` <dbl>, ...8 <lgl>, ...9 <lgl>,
#> #   ...10 <lgl>, ...11 <chr>, ...12 <dbl>