Вы просматриваете каждое наблюдение. Возможно, вы захотите рассмотреть data.table
подход.
Обновление
Как отметил @MichaelChirico, следует использовать метод data.table::split
.
library(data.table)
cities_files <- data.frame(bar = c(1:20000),
city_name = rep(paste0("city ", 1:200), 100),
foo = c(1:20000))
microbenchmark::microbenchmark(
khaynes = {
# library(data.table)
# Set the data.frame as a data.table
cities_files_dt <- data.table(cities_files)
lapply(unique(cities_files_dt[, city_name]), function(city)
fwrite(x = subset(cities_files_dt, city_name == city),
file = paste0(city, ".csv")))
},
MichaelChirico = {
cities_files_dt <- data.table(cities_files)
list_dt <- split(cities_files_dt, cities_files_dt$city_name)
for(i in 1:length(list_dt)) {
fwrite(list_dt[[i]], paste0(names(list_dt[i]), ".csv"))
}
},
times = 5
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# khaynes 661.0689 680.6768 698.2449 683.1407 719.8056 746.5323 5
# MichaelChirico 452.0800 456.5777 499.2832 458.0174 517.4398 612.3011 5
Использование пакета data.table
должно значительно ускорить время обработки:
library(data.table)
# Create a dummy data.frame
cities_files <- data.frame(bar = c(1, 1, 2, 3, 3),
city_name = c("city a", "city a", "city b", "city c", "city c"),
foo = c(20, 14, 40, 50, 60))
# Set the data.frame as a data.table
setDT(cities_files)
lapply(unique(cities_files[, city_name ]), function(city)
fwrite(x = subset(cities_files, city_name == city),
file = paste0(city, ".csv")))
Ну, трудно для предоставления общих рекомендаций, потому что это зависит сильно от входа, что является лучшим.
Вот простой пример, вставляющий абзац в документ DOCX для каждого абзаца в (X) документ HTML с помощью OpenXML SDK v2.0 и XPathDocument:
void ConvertHTML(string htmlFileName, string docFileName)
{
// Create a Wordprocessing document.
using (WordprocessingDocument package = WordprocessingDocument.Create(docFileName, WordprocessingDocumentType.Document))
{
// Add a new main document part.
package.AddMainDocumentPart();
// Create the Document DOM.
package.MainDocumentPart.Document = new Document(new Body());
Body body = package.MainDocumentPart.Document.Body;
XPathDocument htmlDoc = new XPathDocument(htmlFileName);
XPathNavigator navigator = htmlDoc.CreateNavigator();
XmlNamespaceManager mngr = new XmlNamespaceManager(navigator.NameTable);
mngr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
XPathNodeIterator ni = navigator.Select("//xhtml:p", mngr);
while (ni.MoveNext())
{
body.AppendChild<Paragraph>(new Paragraph(new Run(new Text(ni.Current.Value))));
}
// Save changes to the main document part.
package.MainDocumentPart.Document.Save();
}
}
Пример требует, чтобы Ваш вход был допустимым XML, иначе Вы получите исключение при создании XPathDocument.
Обратите внимание на то, что это - очень простой пример, не берущий любое форматирование, заголовки, списки и т.д. во внимание.
Я не уверен, чего на самом деле требуется достигнуть. Документы OpenXML имеют собственную подобную HTML нотацию (WordprocessingML) для элементов форматирования (как абзац, полужирный текст, и т.д.). Если требуется добавить некоторый текст к документу с основным форматированием, чем я скорее предлагаю использовать синтаксис OpenXML и отформатировать вставленный текст с этим.
Если у Вас есть отрывок HTML, который необходимо включать в документ, как это, можно использовать "внешнее содержание" функция OpenXML. С внешним содержанием можно включать документ HTML пакету и создать ссылку (altChunk) в документе в положении, где Вы хотите включать это. Недостаток этого решения, это не все инструменты будут поддерживать (или поддерживать правильно), сгенерированный документ, поэтому я не рекомендую это решение, если Вы действительно не можете изменить источник HTML.
Как включать любое содержание (wordml) к openxml документу в формате Word независимый вопрос, по моему скромному мнению, и ответ зависит очень от того, как сложные модификации, которые Вы хотите применить, и насколько большой документ. Для простого документа я просто считал бы часть документа от пакета, получил бы, это - поток, и загрузите его в XmlDocument. Можно вставить дополнительное содержание в XmlDocument довольно легко и затем сохранить его назад к пакету. Если документ является большим, или Вам нужны сложные модификации в нескольких местах, XSLT является хорошим вариантом.