【问题标题】:Iterating Properly with Custom Function in R在 R 中使用自定义函数正确迭代
【发布时间】:2020-10-28 18:08:20
【问题描述】:
## for individual files
input_files <- list.files("U:/tmp", pattern = "[.]xml")
out <- list()
 
# loop for reading input and writing an output
for(i in 1:length(input_files)){
  df0 <- fxml_importXMLFlat(input_files[i])
  df1 <- fxml_toDataFrame(df0, siblings.of=1, elem.or.attr="elem",col.attr = elem.)
}

flatxml/fxml 库只是做了一些 xml 解析,所以忽略它。我正在做的是读取U/tmp 中的xml 文件,将它们放入一个列表中,然后对于该列表中的每个元素,运行flatxml 操作。

每个文件的输出是一行(在代码中显示为df0)。

如何获取每次迭代都会覆盖的输出 (df0),并将其存储为数据框或列表,每次运行该函数时都会增加一行?不是有一些 i+1 类型的逻辑可以做到这一点吗?

为了重现性,这是我阅读和处理的列表:

x
1   SAFETY1007L.xml
2   SAFETY1008L.xml
3   SAFETY10029.xml
4   SAFETY1000V.xml

在运行 importXMLFlat (df0) 之后,这是最终的数据帧 (df1)请注意它只有 1 行,因此最终数据表将有 4 行 - 每行列表中的元素inpt:

REPORTTIMESTAMP
AGENCYIDENTIFIER
AGENCYNAME
1   2019-06-02T07:08:01.751236  California  Culver City Police Department

感谢您的任何想法。

【问题讨论】:

    标签: r xml list for-loop


    【解决方案1】:

    你真的有很多选择

    1. 您可以使用magic_for

    初始化

    magicfor::magic_for(print, progress=T, silent=T) # initialisation with print
    for(i in 1:length(input_files)){
      df0 <- fxml_importXMLFlat(input_files[i])
      df1 <- fxml_toDataFrame(df0, siblings.of=1, elem.or.attr="elem",col.attr = elem.)
      print(df1) # important for magic_for as expressed ininitialisation
    }
    magic_result # or magic_result_as_dataframe() or magic_result_as_vector
    
    1. 您可以创建一个全局变量以将您的 df 附加到(似乎您尝试仅在 df1

      df<-data.frame() # global variable
           for(i in 1:length(input_files)){
             df0 <- fxml_importXMLFlat(input_files[i])
             df1 <- fxml_toDataFrame(df0, siblings.of=1, elem.or.attr="elem",col.attr = elem.)
           df<-c(df, df1)
           }
      
    2. 你可以通过简单地使用 lapply/sapply

      result<-lapply(input_files, fxml_importXMLFlat)  # i used lapply for lists - sapply does the same for data.frames
      

    我相信还有更多方法可以做到这一点,但我建议选项 3

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多