用R中的自定义函数正确迭代


## 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

谢谢你的任何想法。

你有很多选择,真正的

  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
  • 您可以创建一个全局变量来将您的df附加到(似乎您只尝试在循环内部使用df1<-c(df0,(来执行此操作,但由于您不将其保存到全局变量,它会被覆盖

    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)
    }
    
  • 你可以通过简单地放置来使用lapply/sapply

    result<-lapply(input_files, fxml_importXMLFlat)  # i used lapply for lists - sapply does the same for data.frames
    
  • 我相信还有更多的方法可以做到这一点,但在我的脑海中,我建议选择3

    最新更新