簡體   English   中英

R - 如何在循環中創建列表列表

[英]R - how to create list of list in loop

我想創建列表列表。 一個特定列表應包含來自我的文件夾中的一個特定xml文件的所有關鍵字。 這意味着列表數量是相同數量的文件。 問題是我不知道文件夾中有多少文件。 我嘗試在循環中創建列表列表,如下所示:

my_keywords <-
  list(my_keywords,m) 

但結果有太多嵌套列表。 所以我嘗試創建列表矩陣和循環后轉換矩陣到列表列表。 這是我的代碼:

  #read all xml files in folder data
    f <- list.files(path = "C:\\data\\", pattern = "*.xml", all.files = FALSE,
               full.names = TRUE, recursive = FALSE)

    keywords_matrix <- matrix("", ncol=1, nrow = length(f))
    i<-0

    #for each xml file read and save all keywords
    for (sig in f) {
        i<-i+1
        data_xml <- xmlTreeParse(sig,useInternalNodes=TRUE)
        xml_list <- xpathApply(data_xml, "//keyword", xmlValue)
        #every keyword is in own list, give all keywords to one list
        m <- unlist(xml_list)
        #every keywords list in one row of matrix
        keywords_matrix[i,] <-list(m)

    }

    print (keywords_matrix)
    mylist <- apply(keywords_matrix, 1, as.list)

但我的代碼不起作用。 它給了我這些錯誤:

> Error in keywords_matrix[i, ] <- list(m) : 
>  incorrect number of subscripts on matrix

---

>    Error in apply(keywords_matrix, 1, as.list) : 
>       dim(X) must have a positive length

我的矩陣看起來像:

[[1]]
[1] "a11" "a12" "a13"        

[[2]]
[1]  ""

[[3]]
[1]  "" 

我想要的是看起來像的mylist

[[1]]
"a11" "a12" "a13"        

[[2]]
"b11"        "b12"       "b13" "b14" 

[[3]]
 "c11"        "c12"      

有幫助嗎? 因為我不知道為什么這不起作用。 矩陣中的索引對我來說很好看。

我的xml文件如下所示:

<rule id="1">
    <date>2018-01-12</date>
    <name>name of A element</name>
    <allkeywords>  
        <keyword>a11</keyword>
    <keyword>a12</keyword>
     <keyword>a13</keyword>    
     </allkeywords>  
</rule>

而且:

  <rule id="2">
        <date>2018-01-12</date>
        <name>name of B element</name>
        <allkeywords>  
            <keyword>b11</keyword>
        <keyword>b12</keyword>
         <keyword>b13</keyword>  
        <keyword>b14</keyword> 
         </allkeywords>  
    </rule>

您的預期結果不是嵌套列表,它只是常規的向量列表。 您的代碼可以簡單地通過初始化一個空列表並在循環時向其添加每個元素來工作。

library(XML) 

f <- list.files(pattern = "*.xml", all.files = FALSE,
                  full.names = TRUE, recursive = FALSE)
i<-0
mylist<-list() #initialize list 

for (sig in f) {
  i<-i+1
  data_xml <- xmlTreeParse(sig,useInternalNodes=TRUE)
  xml_list <- xpathApply(data_xml, "//keyword", xmlValue)
  m <- unlist(xml_list)
  mylist[[i]]<-m #add each element to list
}

mylist 

[[1]]
[1] "a11" "a12" "a13"

[[2]]
[1] "b11" "b12" "b13" "b14"

或者你可以用一個lapply來做

mylist<-lapply(f, function(x){
  data_xml <- xmlTreeParse(x,useInternalNodes=TRUE)
  xml_list <- xpathApply(data_xml, "//keyword", xmlValue)
  m <- unlist(xml_list)
})

只需運行lapply上使用XML的XML文件列表xpathSApply 無需使用矩陣作為中間輔助容器。

library(XML)

#read all xml files in folder data
f <- list.files(path = "C:\\data\\", pattern = "*.xml", all.files = FALSE,
                full.names = TRUE, recursive = FALSE)

mylist <- lapply(f, function(i){
  data_xml <- xmlTreeParse(i, useInternalNodes=TRUE)
  xml_list <- xpathSApply(data_xml, "//keyword", xmlValue)
})

mylist

# [[1]]
# [1] "a11" "a12" "a13"

# [[2]]
# [1] "b11" "b12" "b13" "b14"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM