Рассмотрим xmlToDataFrame
для извлечения ваших конкретных элементов данных, затем запустите миграцию заголовков, начиная с первых 15 извлеченных элементов и, наконец, reshape
из длинных в широкие.Поскольку XML поддерживает пространство имен по умолчанию, временный префикс doc назначается для анализа.Ниже предполагается согласованность 15 столбцов не пропущенных Ячейка / Данные узлов.
library(XML)
fileurl <- "pep_slim.xml"
doc <- xmlParse(fileurl)
nmsp <- c(doc="urn:schemas-microsoft-com:office:spreadsheet")
df <- xmlToDataFrame(doc, nodes=getNodeSet(doc, "//doc:Cell", nmsp))
df$Headers <- df$Data[1:15] # ASSIGN HEADERS TO EVERY 15 ROWS
df <- with(df, df[Data != Headers,]) # SUBSET OUT ORIGINAL HEADERS
# ADD 1-15 ID SEQUENCE (FOR RESHAPING)
df$id <- with(df, ave(as.integer(NamedCell), Headers, FUN=seq_along))
# RESHAPE WIDE TO LONG WITH CLEANUP OF NAMES
rdf <- reshape(df, v.names = "Data", timevar="Headers", idvar="id",
drop = "NamedCell", direction="wide", sep="_")
colnames(rdf) <- gsub("Data_", "", colnames(rdf))
rownames(rdf) <- NULL
Вывод
rdf
# id Type EmpCID SerCID ProviderName ProviderType ServiceArea Department Specialty UserType
# 1 1 Provider 123413 234123 Person's Name NURSE PRACTITIONER CHOP SERVICE AREA VIRTUA ORTHOPEDICS Orthopedics Non-Physician
# ReportingPeriodStartDate ReportingPeriodEndDate Metric Numerator Denominator Value
# 1 7/28/2019 8/31/2019 Messages Received per Day - Encounter # Report 0 21 0