我有两个XML文件,我想将它们解析成R中的dataframe,然后进行合并。
将XML文件放入列出的dataframe中
library(XML)
library(plyr)
getxmldf<-function(xmlfile){
booksz <- xmlTreeParse(xmlfile)
xmldf<-ldply(xmlToList(booksz), data.frame)
xmldf.T <- t(xmldf[,2:ncol(xmldf)])
return(xmldf.T)
}然后取消列表&执行合并,但我陷入了取消列表&合并不起作用……
df8 <- as.data.frame(lapply(df8, function(X) unname(unlist(X))))
merge(df8, df8, by = c("V5"))
str(df8, max.level = 1)我附加了两个测试XML文件。它们是来自“作弊引擎”的地址转储
https://drive.google.com/file/d/0BxCrQYKS04mRV1ZEZ1Bza2Vabkk/view?usp=sharing
https://drive.google.com/file/d/0BxCrQYKS04mRRWJUVjdqRUp3Yk0/view?usp=sharing
发布于 2016-05-27 13:44:22
我看过你的档案,里面似乎没有太多有趣的信息。
在每个文件中有许多CheatEntry节点,每个节点包含5个节点: ID、Description、LastState、VariableType和Address。
ID始终按1顺序排列,在第一个文件中从0到87,在第二个文件中从0到110。
描述始终是“”无描述“”。
LastState始终为空。它确实有两个属性:第一个文件中的值始终为6042,第二个文件中的值始终为6122,以及始终与地址节点相同的RealAddress。因此,这两个属性都没有提供任何实际信息。
VariableType始终为"4字节“。
该地址具有一个8位十六进制字符串,该字符串在两个文件内和文件之间始终是唯一的。
考虑到以上所有情况,我不确定为什么要合并它们。在R中,“合并”通常意味着连接一个键上的行,但是我们从这两个文件中获得的数据集之间没有公共键。实际上,也许ID是有意义的,但考虑到您似乎在问题中尝试了"V5“,这似乎是不正确的。
我假设您希望通过rbind()函数按行组合这两个data.frames。我们可以使用lapply()一次性处理这两个文件,然后使用do.call()在每个文件的data.frames上调用单个rbind()调用。
另外,我建议避免使用xmlToList(),而是使用xpathApply()对CheatEntry节点进行有针对性的搜索,然后调用帮助器xmlToDataFrame()函数。这还允许我们使用xmlToDataFrame()的colClasses和stringsAsFactors参数来控制结果列的数据类型。
把所有这些放在一起,我们有:
xmlFiles <- list.files(pattern='\\.CT$');
xmlFiles;
## [1] "CivilizationBE_DX11-6042.TXT.CT" "CivilizationBE_DX11-6122.TXT.CT"
res <- do.call(rbind,lapply(xmlFiles,function(xmlFile)
xmlToDataFrame(
xpathApply(xmlInternalTreeParse(xmlFile),'//CheatEntry'),
c('integer','character','character','character','character'),
stringsAsFactors=F
)
));
head(res); tail(res);
## ID Description LastState VariableType Address
## 1 0 "No description" 4 Bytes 0AEEE67C
## 2 1 "No description" 4 Bytes 0AEEE68C
## 3 2 "No description" 4 Bytes 0AF6E67C
## 4 3 "No description" 4 Bytes 0AF6E68C
## 5 4 "No description" 4 Bytes 0B827378
## 6 5 "No description" 4 Bytes 0B8992C8
## ID Description LastState VariableType Address
## 194 105 "No description" 4 Bytes 25E7EAC4
## 195 106 "No description" 4 Bytes 25E7EAC8
## 196 107 "No description" 4 Bytes 25E7EAD4
## 197 108 "No description" 4 Bytes 2E15F970
## 198 109 "No description" 4 Bytes FF6A673C
## 199 110 "No description" 4 Bytes FFBCA308https://stackoverflow.com/questions/37474472
复制相似问题