## 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
谢谢你的任何想法。
你有很多选择,真正的
- 您可以使用
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