Я пытаюсь обработать выходной файл CSV, который использует «\» почти во всех заголовках столбцов. Пример заголовков столбцов:
"RiverName 0 \ site 1", "RiverName 1 \ site 2", "RiverName 2 \ site 3"
Я пытаюсь отделить расположение рек от номеров участков и поместить эти значения в таблицу в следующем формате:
river site
RiverName 0 site 1
RiverName 1 site 2
RiverName 2 site 3
Я нашел пару связанных ответов для разделения на "\", которые не решили мою проблему, но одно решение или другое могут не работать, потому что я пытаясь разбить строку в каждом столбце на две строки/два столбца.
Конечная цель состоит в том, чтобы иметь возможность определить, какие «RiverName #» имеют более одного «сайта #», и использовать этот список для выбора столбцов данных из полной таблицы данных. Каждый набор "site #", принадлежащий одному и тому же "RiverName # \...", будет иметь свои значения во всех строках. Максимальное количество «сайтов #» для одного «RiverName #» должно быть равно 2, но я обрабатываю более 1000 столбцов данных с некоторыми вариациями в том, какие сайты сообщают, в зависимости от запуска модели.
Небольшой кусок фактических данных выглядит так:
Streamflow (below node or reach listed)
Scenario: test_1986 All Rivers (75) All months (12)
$Unit = Cubic Meter
$ListSeparator = ,
$DecimalSymbol = .
$Columns = Year Timestep "AmericanFork 0 \ Headflow[Cubic Meter]" "AmericanFork 1 \ Catchment Inflow Node 96[Cubic Meter]" "AmericanFork 2 \ Reach[Cubic Meter]" "AmericanFork 3 \ AmericanFk AB UpperPower 10164500 (gauge)[Cubic Meter]" "AmericanFork 3 \ Catchment Inflow Node 97[Cubic Meter]" "AmericanFork 4 \ Reach[Cubic Meter]" "AmericanFork 5 \ Catchment Inflow Node 391[Cubic Meter]" "AmericanFork 6 \ Reach[Cubic Meter]" "AmericanFork 7 \ Catchment Inflow Node 23[Cubic Meter]" "AmericanFork 8 \ Reach[Cubic Meter]"
1985 1 0 233162 233162 59529600 396115 396115 466798 466798 822034 822034
1985 2 0 224064 224064 46915200 380629 380629 448538 448538 789499 789499
1985 3 0 215528 215528 68860800 366083 366083 460029 460029 3082519 3082519
1985 4 0 479387 479387 240883200 1186144 1186144 1732742 1732742 9214172 9214172
1985 5 0 1129770 1129770 568857600 2394140 2394140 2573311 2573311 3957801 3957801
1985 6 0 560258 560258 457142400 1046736 1046736 1225671 1225671 2936521 2936521
1985 7 0 403568 403568 205804800 742211 742211 844912 844912 2336802 2336802
1985 8 0 286687 286687 118886400 509035 509035 593644 593644 1204795 1204795
1985 9 0 294099 294099 79228800 543535 543535 643345 643345 1489512 1489512
1985 10 0 456219 456219 88646400 1057770 1057770 1287924 1287924 4032124 4032124
1985 11 0 264292 264292 68256000 509662 509662 592545 592545 2725935 2725935
1985 12 0 251136 251136 66873600 472174 472174 550178 550178 934797 934797
Чтение строки имен столбцов после чтения всего CSV-файла в R привело к фрейму данных из одной строки, но каждый столбец имеет 252 уровня (общее количество строк в исходном фрейме данных, из которого была извлечена одна строка). Вместо этого , я использовал следующий код для чтения только строки, содержащей имена столбцов из CSV.
> ras <- read.table(filename, header = FALSE, sep = ",", skip = 5, nrow = 1)
Вывод (ras
) выглядит так:
V1 V2 V3
1 $Columns = Year Timestep AmericanFork 0 \\ Headflow[Cubic Meter]
V4
1 AmericanFork 1 \\ Catchment Inflow Node 96[Cubic Meter]
V5
1 AmericanFork 2 \\ Reach[Cubic Meter]
V6
1 AmericanFork 3 \\ AmericanFk AB UpperPower 10164500 (gauge)[Cubic Meter]
V7
1 AmericanFork 3 \\ Catchment Inflow Node 97[Cubic Meter]
V8
1 AmericanFork 4 \\ Reach[Cubic Meter]
V9
1 AmericanFork 5 \\ Catchment Inflow Node 391[Cubic Meter]
V10
1 AmericanFork 6 \\ Reach[Cubic Meter]
V11
1 AmericanFork 7 \\ Catchment Inflow Node 23[Cubic Meter]
V12
1 AmericanFork 8 \\ Reach[Cubic Meter]
Я удалил первые два значения (метки строк из исходного CSV), а затем имена значений в попытке упростить данные, которые я хочу разделить.
ras2 <- ras[ ,-c(1,2)]
ras3 <- unlist(c(wnr2), use.names = FALSE)
Вывод (ras3
) теперь выглядит так:
[1] AmericanFork 0 \\ Headflow[Cubic Meter]
[2] AmericanFork 1 \\ Catchment Inflow Node 96[Cubic Meter]
[3] AmericanFork 2 \\ Reach[Cubic Meter]
[4] AmericanFork 3 \\ AmericanFk AB UpperPower 10164500 (gauge)[Cubic Meter]
[5] AmericanFork 3 \\ Catchment Inflow Node 97[Cubic Meter]
[6] AmericanFork 4 \\ Reach[Cubic Meter]
[7] AmericanFork 5 \\ Catchment Inflow Node 391[Cubic Meter]
[8] AmericanFork 6 \\ Reach[Cubic Meter]
[9] AmericanFork 7 \\ Catchment Inflow Node 23[Cubic Meter]
[10] AmericanFork 8 \\ Reach[Cubic Meter]
10 Levels: AmericanFork 0 \\ Headflow[Cubic Meter] ...
«AmericanFork 3» — это пример «RiverName #», у которого есть пара участков («AmericanFk AB UpperPower 10164500 (датчик) [кубический метр]» и «Узел притока водосбора 97 [кубический метр]»), из которых я хочу извлечь полный CSV для сравнения.