WedX - журнал о программировании и компьютерных науках

Как я могу разделить строки на обратную косую черту \ в R?

Я пытаюсь обработать выходной файл 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 для сравнения.

08.03.2016

  • Вы можете разделить свой первый пример с помощью x <- data.frame(do.call(rbind, strsplit(s, '\\s*[\\]\\s*'))); names(x) <- c('river', 'site'), где s — вектор строки из трех пар. 09.03.2016
  • Кажется, он работает и с большими данными. Вы можете подсчитать перекрывающиеся сайты с помощью table(x$river); если вам нужны только реки с повторами, вы можете подмножить таблицу: table(x$river)[table(x$river) > 1] 09.03.2016

Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]