繁体   English   中英

根据名称分组列表列表

[英]Subset a list of lists acording to names

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

原始数据

我需要的是具有结构(转换后的数据)的列表列表:

转换后的数据

即对于我的子列表中的每个不同的行(名称),我需要一个新的子列表。 该子列表将具有该行的名称,并且行(名称)将是原始子列表的名称,并且数据将由原始子列表中的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" 
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

初步观察:

  • 正如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" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM