Подгруппа список списков в соответствии с именами - PullRequest
0 голосов
/ 04 января 2019

Я борюсь со списком списков со структурой (исходные данные):

original data

Мне нужен список списков со структурой (преобразованные данные):

transformed data

т.е. Для каждой отдельной строки (имени) в моих подсписках мне нужен новый подсписок. Этот подсписок будет иметь имя этой строки, а строка (имена) будет именами исходных подсписков, а данные будут состоять из столбцов a и e из исходного подсписка.

Я действительно знаю, что должен опубликовать некоторый код, я попробую этот

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(6L, 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,] ""         "Modalidade de Emprego" ""            "Intervalo de"
[2,] "Culturas" ""                      "LMR (mg/kg)" ""            
[3,] ""         "(Aplicação)"           ""            "Segurança"   
[4,] "Algodão"  "Pós-emergência"        "0,04"        "(2)"         
[5,] "Soja"     "Dessecante"            "4,0"         "07 dias"     
[6,] "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"

и результат

result<-list(`soja` = structure(c("a1", "a1","a2", "4,0", "4,0", "0,02"), .Dim = 3:2, .Dimnames = list( NULL, c("ATIVO", "LMR (mg/kg)"))))

result
$soja
     ATIVO LMR (mg/kg)
[1,] "a1"  "4,0"      
[2,] "a1"  "4,0"      
[3,] "a2"  "0,02"

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Некоторые начальные наблюдения:

  • Как уже упоминалось Грегор , данные выглядят поврежденными, особенно заголовки столбцов. Поэтому я намеренно решил исправить набор данных образца.
  • Наличие идентичных заголовков столбцов (после исправления) в обоих элементах списка позволяет предположить, что основная структура данных - это 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"
0 голосов
/ 08 января 2019
names<-unique(unlist(simplify2array(lapply(original,`[`,,1))))
my.list3<-list()
i=1
m=1
n=1
for (i in 1:length(nomes)){
    nome<-names[i]
    my.list3[[nome]]<-matrix(NA,ncol=4)
    print(nome)
    for (n in 1:length((original))){
        for (m in 1:nrow(original[[n]])){
            if(nome==original[[n]][m,1]){
                vetor<-original[[n]][m,]
                vetor[vetor==nome]<-names(original)[[n]]
                my.list3[[i]]<-rbind(my.list3[[i]],vetor)
            }}}}
for (n in seq_along(my.list3)){
    ind <- apply(my.list3[[n]], 1, function(x) all(is.na(x)))
    my.list3[[n]] <- my.list3[[n]][ !ind, ]
    if (is.matrix(my.list3[[n]])){my.list3[[n]] <- my.list3[[n]][,c(1,3)]} 
    else{my.list3[[n]] <- my.list3[[n]][c(1,3)]}
    rownames(my.list3[[n]])<-c()
   if (is.matrix(my.list3[[n]])){colnames(my.list3[[n]])<-c("Ativo","LMR mg/kg")} else{names(my.list3[[n]])<-c("Ativo","LMR mg/kg")}}
my.list3
...