我有几百个结构非常简单的xml文件:
NM_000016 3.87178e-09 3:7.8009e-248 14:1.1621e-262
NM_000018 5.49001e-12 9:1.06231e-154
NM_001032295 2.5366e-10 14:4.46519e-286 30:1.70136e-17 31:1.26709e-268
我想将它们转换为与原始文件略有不同的csv文件:
NM_000016 3.87178e-09 3 7.8009e-248 14 1.1621e-262
NM_000018 5.49001e-12 9 1.06231e-154
NM_001032295 2.5366e-10 14 4.46519e-286 30 1.70136e-17 31 1.26709e-268
区别在于:删除“3:7.8009e-248”中的“:”,并将数字“3”“7.8009e-248”分配给两列。
如何在R中高效地完成?非常感谢!
答案 0 :(得分:1)
正如jake所说,如果您的xml文件恰到好处,使用XML :: xmlToDataFrame和utils :: write.csv会有所帮助。如果没有,您可能不得不求助于正则表达式来查找标签内的文本,构建数据框,然后使用write.csv
答案 1 :(得分:0)
如果没有真正看到你正在使用的内容,这里有一个建议:
首先,一些示例数据:
X <- tempfile()
cat("NM_000016 3.87178e-09 3:7.8009e-248 14:1.1621e-262",
"NM_000018 5.49001e-12 9:1.06231e-154",
"NM_001032295 2.5366e-10 14:4.46519e-286 30:1.70136e-17 31:1.26709e-268",
sep = "\n", file = X)
将read.table
与fill = TRUE
一起使用(因为您的数据似乎不平衡)。
Y <- read.table(X, header = FALSE, fill = TRUE)
Y
# V1 V2 V3 V4 V5
# 1 NM_000016 3.87178e-09 3:7.8009e-248 14:1.1621e-262
# 2 NM_000018 5.49001e-12 9:1.06231e-154
# 3 NM_001032295 2.53660e-10 14:4.46519e-286 30:1.70136e-17 31:1.26709e-268
使用我的“splitstackshape”软件包方便地将列拆分成多列。
library(splitstackshape)
Z <- concat.split.multiple(Y, c("V3", "V4", "V5"), ":")
Z
# V1 V2 V3_1 V3_2 V4_1 V4_2 V5_1 V5_2
# 1 NM_000016 3.87178e-09 3 7.80090e-248 14 1.16210e-262 NA NA
# 2 NM_000018 5.49001e-12 9 1.06231e-154 NA NA NA NA
# 3 NM_001032295 2.53660e-10 14 4.46519e-286 30 1.70136e-17 31 1.26709e-268
当然,从这里开始,只需write.csv
就可以将新版本写入CSV文件。