根据名称分组列表列表

时间:2019-01-04 19:51:31

标签: r list subset reshape sublist

我正在努力处理具有结构(原始数据)的列表列表:

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 :(得分:0)

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

答案 1 :(得分:0)

一些初步发现:

  • Gregor所述,数据看起来已损坏,尤其是列标题。因此,我故意选择修复示例数据集。
  • 两个列表元素中都存在相同的列标题(修复后),这表明基础数据结构是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

或者,要满足OP的预期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"