【问题标题】:Subset a list of lists acording to names根据名称子集列表列表
【发布时间】:2019-01-04 19:51:30
【问题描述】:

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

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

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

【问题讨论】:

  • 从例子中不清楚,你想要什么。 result 是预期的输出吗?图片和示例在结构上有些差异
  • 似乎您在读取数据时遇到问题 - original 是矩阵列表,其中第一行看起来实际上应该是列名,而字符串条目(如 "0,02")可能应该是数字0.02。我建议在尝试转换数据之前先修复您的数据读取过程。 How to make a list of data frames 是很好的背景阅读,还可以查看 ?read.csv2dec 参数,您使用的任何读取函数将逗号读取为小数。
  • @akrun 完全正确! result 只是预期的输出。我的图形输入数据和文字输入数据确实有一些差异,那是因为我的数据集实际上很大,我只是试图给出一个可口的例子。
  • @Gregor 感谢您的反馈。我同意你的观点,我的输入数据有一些问题。所说的行名实际上不是行名,因为它是一个矩阵,所以它们是 col1,因此我需要重新排列我的数据,为 col1 中的每个唯一字符串创建一个新矩阵。但是,所有数据都是文本的,因此不需要逗号问题。
  • 我引用的是列名,而不是行名。在您的图片中,列名很重要。在您的示例输入数据中,没有列名。因此,使用该输入,第一步将是在流程中这个尴尬的时刻烦人地创建列名,但在现实生活中,第一步应该是修复上游的输入流程,以便列名是正确的。一旦列名正确,作为这个问题重点的转换就会容易得多。因此,我要求您将输入问题与转换问题分开。

标签: r list subset reshape sublist


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    一些初步观察:

    • 正如Gregor 已经提到的,数据看起来已损坏,尤其是列标题。所以,我特意选择修复样本数据集。
    • 两个列表元素中存在相同的列标题(修复后)表明底层数据结构是 data.frame 而不是矩阵。 (虽然技术上存储为矩阵,第一行包含列标题)。
    • 由于每个列表元素的数据具有相同的结构(列的数量、名称和类型),因此数据可以存储在大型 data.frame 对象中。这将使后续的数据操作和聚合比处理嵌套列表更容易。

    下面的代码将每个列表元素的矩阵转换为一个data.table对象,并将它们绑定到一个uniteddata.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"
    

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 2018-06-04
      • 2022-08-09
      • 2015-08-06
      • 2016-06-22
      • 2021-05-19
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      相关资源
      最近更新 更多