Некоторые начальные наблюдения:
- Как уже упоминалось Грегор , данные выглядят поврежденными, особенно заголовки столбцов. Поэтому я намеренно решил исправить набор данных образца.
- Наличие идентичных заголовков столбцов (после исправления) в обоих элементах списка позволяет предположить, что основная структура данных - это data.frame, а не матрица. (Хотя технически он хранится в виде матрицы с первой строкой, содержащей заголовки столбцов).
- Поскольку данные каждого элемента списка имеют идентичную структуру (номер, имя и тип столбцов), данные могут храниться в большом объекте data.frame. Это значительно упростит последующую обработку данных и агрегирование, чем работа с вложенными списками.
Приведенный ниже код преобразует матрицу каждого элемента списка в объект data.table и связывает их в united
data.table. Имена элементов списка сохраняются в столбце 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
Оттуда мы можем получить запрошенные данные, например,
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
Конечно, данные можно снова разбить на части:
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
или, чтобы удовлетворить ожидаемый ОП 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
Для демонстрации я воздержался от фильтрации для "Soja"
.
Фиксированные данные
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"