У меня есть этот скрипт R:
rm(list = ls())
library(tidyr)
suppressWarnings(library(dplyr))
outFile = "zFinal.lua"
cat("\014\n")
cat(file = outFile, sep = "")
filea <- read.csv("csva.csv", strip.white = TRUE)
fileb <- read.csv("csvb.csv", strip.white = TRUE, sep = ";", header=FALSE)
df <-
merge(filea, fileb, by.x = c(3), by.y = c(1)) %>%
subset(select = c(1, 3, 6, 2)) %>%
arrange(ColA, ColB, V2) %>%
group_by(ColA) %>%
mutate(V2 = paste0('"', V2, "#", ColB, '"')) %>%
summarise(ID = paste(V2, collapse = ", ", sep=";")) %>%
mutate(ID = paste0('["', ColA, '"] = {', ID, '},')) %>%
mutate(ID = paste0('\t\t', ID))
df <- df[c("ID")]
cat("\n\tmyTable = {\n", file = outFile, append = TRUE, sep = "\n")
write.table(df, append = TRUE, file = outFile, sep = ",", quote = FALSE, row.names = FALSE, col.names = FALSE)
cat("\n\t}", file = outFile, append = TRUE, sep = "\n")
# Done
cat("\nDONE.", sep = "\n")
Как видите, этот скрипт открывает csva.csv и csvb.csv.
Это csva.csv:
ID,ColA,ColB,ColC,ColD
2,3,100,1,1
3,7,300,1,1
5,7,200,1,1
11,22,900,1,1
14,27,500,1,1
16,30,400,1,1
20,36,900,1,1
23,39,800,1,1
24,42,700,1,1
29,49,800,1,1
45,3,200,1,1
И это csvb.csv:
100;file1
200;file2
300;file3
400;file4
Это выходной файл, который генерирует мой скрипт и файлы csv:
myTable = {
["3"] = {"file1#100", "file2#200"},
["7"] = {"file2#200", "file3#300"},
["30"] = {"file4#400"},
}
Этот выходной файл является именно тем, что Я хочу. Это прекрасно.
Вот что делает скрипт. Я не уверен, что могу объяснить это очень хорошо, поэтому, если я не справлюсь с этим, пропустите этот раздел.
Для каждой строки в csva.csv, если Col C (csva ) содержит число, которое содержится в столбце 1 (csvb), тогда выходной файл должен содержать строку, подобную этой:
["3"] = {"file1#100", "file2#200"},
Итак, в приведенном выше примере первая строка в ColA (csva) содержит число 3 и colB для этой строки равно 100. В csvb столбец 1 содержит 100, а столбец 2 содержит file1 # 100.
Поскольку csva содержит еще одно число 3 в ColA (последняя строка), это также обрабатывается и вывод в ту же строку.
Хорошо, так что мой сценарий действительно работает очень хорошо и выдает идеальный вывод. Проблема в том, что бегать слишком долго. csva и csvb в моем вопросе содержат всего несколько строк, поэтому вывод происходит мгновенно.
Однако данные, с которыми мне приходится работать в реальном мире, - csva - более 300 000 строк, а csvb - более 900 000 строк. , Таким образом, выполнение сценария занимает очень много времени (слишком долго, чтобы сделать его возможным). Он работает прекрасно, но для его запуска требуется слишком много времени.
Из-за постепенного комментирования строк кажется, что замедление происходит из-за мутации и суммирования. Без этих строк скрипт запускается примерно за 30 секунд. Но с мутированием и суммированием это занимает часы.
Я не слишком продвинут в R, поэтому как я могу заставить мой скрипт работать быстрее, возможно, улучшив мой синтаксис или предоставив более быстрые альтернативы для мутирования и суммирования?