#r #sorting
Вопрос:
У меня есть папка под названием «HUC» с 2100 файлами, каждый из которых назван аббревиатурой и номером. В каждом файле есть три столбца данных, идентичных по длине и с одинаковыми заголовками. У меня есть еще один файл под названием «средства» с 2100 rows
годом . Каждый row
из них соответствует одному file
из них в папке HUC и назван соответствующим образом.
Например, строка A2 в «означает» содержит «1010001» (его название), а B2 содержит данные о средствах. Данные строки «1010001» соответствуют файлу в папке HUCs под названием «mricgcm_1010001».
Мне нужно каким-то образом скопировать каждую строку из файла «средства» по одной за раз и поместить данные (три ячейки в строке) в соответствующий файл в новом диапазоне столбцов. Таким образом, текущие данные в файле HUC находятся в столбцах A/B/C, а новые данные «означает» могут быть помещены в D/E/F (или какой-либо эквивалент с разделителями).
Если бы существовала только одна папка с 2100 файлами, я бы подумал о том, чтобы сделать это вручную. Но у меня есть несколько похожих папок. Я даже не могу сообразить, как это сделать. Возможно ли это в R? Я старался изо всех сил, но, пожалуйста, спросите, нуждается ли это в дальнейших объяснениях.
Это начало списка файлов HUC:
mricgcm_1010002.csv
mricgcm_1010003.csv
mricgcm_1030001.csv
mricgcm_1040001.csv
mricgcm_1040002.csv
mricgcm_1050001.csv
mricgcm_1050002.csv
mricgcm_1070002.csv
mricgcm_1080107.csv
mricgcm_1080204.csv
mricgcm_1090003.csv
mricgcm_1100001.csv
mricgcm_1100002.csv
mricgcm_1100003.csv
mricgcm_1200001.csv
Это рабочий лист в файле «средства».:
HUC Means
1010002 141.0727273
1010003 148.6072727
1030001 158.3327273
1040001 181.1127273
1040002 222.78
1050001 163.4818182
1050002 231.9272727
1070002 201.5018182
1080107 183.0545455
1080204 197.3836364
1090003 209.14
1100001 193.0472727
1100002 186.1963636
1100003 199.2854545
1200001 1.021818182
Вот что сейчас содержат файлы HUC:
HUC Year Predicted
mricgcm_1010002 1961 10.8
mricgcm_1010002 1962 4.6
mricgcm_1010002 1963 0.8
mricgcm_1010002 1964 66.3
mricgcm_1010002 1965 20.4
mricgcm_1010002 1966 8.5
mricgcm_1010002 1967 13.5
mricgcm_1010002 1968 3.7
mricgcm_1010002 1969 59.2
mricgcm_1010002 1970 13.8
mricgcm_1010002 1971 5.5
mricgcm_1010002 1972 1.9
mricgcm_1010002 1973 9.9
mricgcm_1010002 1974 11.7
mricgcm_1010002 1975 52.4
И это и пример того, что я хотел бы в результате, для каждого файла:
HUC Year Predicted HUC Mean
mricgcm_1010002 1961 10.8 1010002 141.0727273
mricgcm_1010002 1962 4.6 141.0727273
mricgcm_1010002 1963 0.8 141.0727273
mricgcm_1010002 1964 66.3 141.0727273
mricgcm_1010002 1965 20.4 141.0727273
mricgcm_1010002 1966 8.5 141.0727273
mricgcm_1010002 1967 13.5 141.0727273
mricgcm_1010002 1968 3.7 141.0727273
mricgcm_1010002 1969 59.2 141.0727273
mricgcm_1010002 1970 13.8 141.0727273
mricgcm_1010002 1971 5.5 141.0727273
mricgcm_1010002 1972 1.9 141.0727273
mricgcm_1010002 1973 9.9 141.0727273
mricgcm_1010002 1974 11.7 141.0727273
mricgcm_1010002 1975 52.4 141.0727273
Примечание, FTR: Среднее значение НЕ является средним значением столбца прогнозируемых данных, иначе я мог бы просто запустить формулу среднего значения для этого столбца. Это среднее значение исторических данных, полученных из других источников.
Это то, что я получаю сейчас:
Designation HUC YEAR RO_MM HIST HUC Historic Mean D
mricgcm 1010004 1961 71.8
mricgcm 1010004 1962 119
mricgcm 1010004 1963 177.7
mricgcm 1010004 1964 166
mricgcm 1010004 1965 159
mricgcm 1010004 1966 180.3
Итак, что-то происходит, но данных нет.
Комментарии:
1. Можете ли вы привести какой-нибудь пример ввода с парой файлов вместе с ожидаемым выводом, чтобы его было легче понять.
2. Поэтому вы хотите скопировать строку в
means
соответствующий файл вHUCs
виде новых столбцовD/E/F
.3. Каков формат вашего файла? csv?
4. Мир Ван, да. Файлы .csv. И Ронак Шах, сработают ли изображения?
5. Ронак Шах-отредактировано, чтобы включить пример списка файлов, данные в файле «означает» и как выглядят файлы HUC.
Ответ №1:
Вот мое решение. Структура каталога такова
.
├── copy_means_to_FUCs.R
├── HUCs
│ ├── mricgcm_1010001.csv
│ └── mricgcm_1010002.csv
└── means.csv
Затем код организуется следующим образом
library(data.table)
# install.packages("qpcR")
means <- fread("means.csv")
means$HUC <- as.character(means$HUC)
# get all file's name
fn <- list.files("./HUCs",pattern="*.csv",full.names = TRUE)
f_paste <- function(x){
csv <- fread(x)
num <- gsub(".*_(.*).csv","\1",x)
tmp <- cbind(csv,means[num == HUC,]) # match row by name then cbind them
#tmp <- qpcR:::cbind.na(csv, means[num == HUC,])
fwrite(tmp,x)
invisible(return(NULL))
}
invisible(lapply(fn, f_paste)) # Attention: run once is enough
Несовершенство заключается в том, что строка из means
заполняется во всех строках из-за cbind
. Я думаю, что это не основная проблема, которую нужно решить.
( Вы можете ответить cbind
, qpcR:::cbind.na(csv, means[num == HUC,])
чтобы решить эту проблему)
Комментарии:
1. Спасибо тебе за это, Мир Ван. У меня возникли некоторые проблемы. Я установил
qpcR
, хотя то, что я нашел, гласило «Измерение транскрипции генов с использованием технологии полимеразной цепной реакции обратной транскрипции в реальном времени (RT-qPCR)», что меня смутило. Я прошел через линии, но сегмент f_paste находится над моей головой, и в этом заключается проблема. Файлы папок HUC, как показано выше, не называются исключительно именем HUC#, но имеют обозначение перед номером. Переименовать файлы не проблема, не так ли? И может ли R использовать файлы, которые являются просто числами, в качестве имен?2. Я также не понимаю, что вы имеете в виду под «несовершенным местом», но я еще не добрался туда.
3. Проверьте мой новый код. Давайте сначала проигнорируем
qpcR
. Ты можешь запустить его сейчас?4. Я предлагаю вам скопировать несколько файлов, как я показываю в этом ответе, для тестирования, прежде чем вы полностью освоите этот сценарий R. ( Просто избегайте перепутывания ваших файлов)
5. Итак, тем временем я изменил все имена файлов на цифры, и это ничего не испортило. Я также разделил столбцы в файлах так, чтобы обозначение было в отдельном столбце, а HUC# был один в столбце с именем HUC. И, да, конечно, я запускаю это на пяти файлах (копиях), а не на >8000, которые мне в конечном итоге нужно сделать. Но это не сработало-и новое тоже. Я получил [[1]]NULL[[2]]NULL[[3]]NULL и т. Д.