Some initial observations:
- As already mentioned by Gregor, the data look corrupted, especially the column headers. So, I deliberately choose to fix the sample dataset.
- The existence of identical column headers (after the fix) in both list elements suggest that the underlying data structure is a data.frame rather than a matrix. (Although technically stored as matrix with the first row containing the column headers).
- As the data of each list element has identical structure (number, name, and type of columns) the data can be stored in a large data.frame object. This will make subsequent data manipulation and aggregation much easier than dealing with nested lists.
The code below converts the matrix of each list element into a data.table object and binds them into a united
data.table. The names of the list elements is preserved in column ATIVO
:
library(data.table)
library(magrittr)
united <- lapply(original, function(x) as.data.table(x[-1, ]) %>% setnames(x[1, ])) %>%
rbindlist(idcol = "ATIVO")
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a1 Algodão Pós-emergência 0,04 (2)
2: a1 Soja Dessecante 4,0 07 dias
3: a1 Soja Pós-emergência 4,0 (1)
4: a2 Cebola Pós-emergência 0,02 60 dias
5: a2 Feijão Pós-emergência 0,02 60 dias
6: a2 Soja Pós-emergência 0,02 60 dias
7: a2 Trigo Pós-emergência 0,02 70 dias
From there, we can retrieve the requested data, e.g.,
united[(order(Culturas, ATIVO)), .(Culturas, ATIVO, `LMR (mg/kg)`)]
Culturas ATIVO LMR (mg/kg)
1: Algodão a1 0,04
2: Cebola a2 0,02
3: Feijão a2 0,02
4: Soja a1 4,0
5: Soja a1 4,0
6: Soja a2 0,02
7: Trigo a2 0,02
Of course, the data can be split into pieces again:
split(united, by = "Culturas")
$Algodão
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a1 Algodão Pós-emergência 0,04 (2)
$Soja
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a1 Soja Dessecante 4,0 07 dias
2: a1 Soja Pós-emergência 4,0 (1)
3: a2 Soja Pós-emergência 0,02 60 dias
$Cebola
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a2 Cebola Pós-emergência 0,02 60 dias
$Feijão
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a2 Feijão Pós-emergência 0,02 60 dias
$Trigo
ATIVO Culturas Modalidade de Emprego (Aplicação) LMR (mg/kg) Intervalo de Segurança
1: a2 Trigo Pós-emergência 0,02 70 dias
or, to meet OP's expected result
:
split(united, by = "Culturas") %>%
lapply(`[`, j = c("ATIVO", "LMR (mg/kg)")) # data.table syntax
$Algodão
ATIVO LMR (mg/kg)
1: a1 0,04
$Soja
ATIVO LMR (mg/kg)
1: a1 4,0
2: a1 4,0
3: a2 0,02
$Cebola
ATIVO LMR (mg/kg)
1: a2 0,02
$Feijão
ATIVO LMR (mg/kg)
1: a2 0,02
$Trigo
ATIVO LMR (mg/kg)
1: a2 0,02
For demonstration, I have refrained to filter for "Soja"
.
Fixed Data
original <-
list(a1 = structure(c("Culturas", "Algodão", "Soja", "Soja",
"Modalidade de Emprego (Aplicação)", "Pós-emergência", "Dessecante",
"Pós-emergência", "LMR (mg/kg)", "0,04", "4,0", "4,0", "Intervalo de Segurança",
"(2)", "07 dias", "(1)"), .Dim = c(4L, 4L)), a2 = structure(c("Culturas",
"Cebola", "Feijão", "Soja", "Trigo", "Modalidade de Emprego (Aplicação)",
"Pós-emergência", "Pós-emergência", "Pós-emergência", "Pós-emergência",
"LMR (mg/kg)", "0,02", "0,02", "0,02", "0,02", "Intervalo de Segurança",
"60 dias", "60 dias", "60 dias", "70 dias"), .Dim = 5:4))
original
$a1
[,1] [,2] [,3] [,4]
[1,] "Culturas" "Modalidade de Emprego (Aplicação)" "LMR (mg/kg)" "Intervalo de Segurança"
[2,] "Algodão" "Pós-emergência" "0,04" "(2)"
[3,] "Soja" "Dessecante" "4,0" "07 dias"
[4,] "Soja" "Pós-emergência" "4,0" "(1)"
$a2
[,1] [,2] [,3] [,4]
[1,] "Culturas" "Modalidade de Emprego (Aplicação)" "LMR (mg/kg)" "Intervalo de Segurança"
[2,] "Cebola" "Pós-emergência" "0,02" "60 dias"
[3,] "Feijão" "Pós-emergência" "0,02" "60 dias"
[4,] "Soja" "Pós-emergência" "0,02" "60 dias"
[5,] "Trigo" "Pós-emergência" "0,02" "70 dias"