Я новичок в R и изо всех сил пытался упростить код с помощью цикла for. Я пытаюсь получить данные о качестве воды из онлайн-базы данных, используя пакет dataRetrieval. В настоящее время я продублировал код для каждого сайта и изменил номер сайта и выходное имя, но пытался упростить это, помещая скрипт в цикл for, и у меня возникли проблемы с созданием отдельных таблиц данных с уникальными идентификаторами.
Исходный код, который создает таблицу данных для каждого сайта. Единственные переменные, которые изменяются, — это siteNumbers и имя таблицы данных «x»_dataTable.
#BW00A
siteNumbers = c("383652091125002")
parameterCode = c("00010","00095", "00300", "00400", "34475", "34485", "45617")
startDate = "1900-01-01"
endDate = "2020-12-01"
BW00A_dataTable <- readNWISqw(siteNumbers, parameterCode,
startDate, endDate)
#BW01
siteNumbers = c("383648091124501")
parameterCode = c("00010","00095", "00300", "00400", "34475", "34485", "45617")
startDate = "1900-01-01"
endDate = "2020-12-01"
BW01_dataTable <- readNWISqw(siteNumbers, parameterCode,
startDate, endDate)
#BW01A
siteNumbers = c("383648091124502")
parameterCode = c("00010","00095", "00300", "00400", "34475", "34485", "45617")
startDate = "1900-01-01"
endDate = "2020-12-01"
BW01A_dataTable <- readNWISqw(siteNumbers, parameterCode,
startDate, endDate)
Новый код Я не могу приступить к работе. Я поместил siteNumbers и siteNames во фрейм данных. Я хочу, чтобы скрипт внутри цикла for перебирал siteNumbers, извлекал данные, а затем приписывал вновь созданную таблицу данных соответствующему siteNames, также известному как unique_siteName. Я не уверен, что это вообще возможно.
df <- data.frame(
siteNumbers = c("383652091125001", "383652091125002", "383648091124501", "383648091124502", "383506091132201", "383508091132002", "383508091132004", "383519091133701", "383544091132601", "383544091132502", "383628091124801", "383639091125902", "383639091125901", "383638091125001", "383638091125002", "383631091124803", "383631091124804", "383631091124801", "383631091124802", "383636091123801", "383636091123811", "383616091125701", "383640091130701", "383640091130702", "383621091130701", "383621091130703", "383621091130702", "383624091130501", "383624091130502", "383616091130801", "383616091130802", "383644091131601", "383627091130201", "383622091130604", "383622091130605", "383557091132001", "383614091132801"),
siteName = c("BW-00", "BW-00A", "BW-01", "BW-01A", "MW-04", "MW-04A", "MW-04B", "MW-11", "BW-21", "BW-21A", "210TB-C6", "Bates Spring", "Bates Spring below dam", "BW-02", "BW-02A", "BW-04A-D", "BW-04A-S", "BW-04D", "BW-04S", "BW-05", "BW-05A", "BW-07", "BW-08", "BW-08A", "BW-11", "BW-11A-D", "BW-11A-S", "BW-13", "BW-13A", "BW-14", "BW-14A", "BW4-15", "BW4-16", "BW4-17", "BW4-18", "W3", "W4")
)
parameterCode = c("00010","00095", "00300", "00400", "34475", "34485", "45617")
startDate = "1900-01-01"
endDate = "2020-12-01"
for (row in df)
{
unique_siteName <- readNWISqw(siteNumbers, parameterCode,
startDate, endDate)
}
Спасибо за вашу помощь!





Вам нужно перебрать индекс строки и сослаться на фрейм данных с номером строки в цикле и создать list для накопления результатов:
results <- list()
for (row in 1:nrow(df)) {
results[[i]] <- readNWISqw(df$siteNumbers[i], parameterCode,
startDate, endDate)
}
names(results) <- df$siteName
R также предлагает lapply как способ упростить этот распространенный шаблон. Приведенный выше цикл эквивалентен этому:
results <- lapply(df$siteNumbers, FUN = readNWISqs, parameterCode, startDate, endDate)
names(results) <- df$siteName
Я бы посоветовал прочитать мой ответ на Как составить список фреймов данных? для дальнейшего обсуждения и объяснения, как того, почему мы делаем это таким образом, так и того, какие следующие шаги будут хорошими (например, объединение списка results в один фрейм данных).
В R обычно рекомендуется сохранять связанные объекты, такие как фреймы данных, в списке. Вы можете присваивать имена каждому объекту списка и/или ссылаться на объект списка по его числовому индексу. Например,
mylist[[3]]относится к 3-му объекту в спискеmylist. Обработка всех связанных объектов в списке также упрощается с помощью функции lapply.