У меня есть CSV-файл, ужасный формат я не могу изменить (упрощенный здесь):штабелирования столбцы с одинаковыми именами в R
Inc,a_One,a_Two,a_Three,b_One,b_Two,b_Three
1,1,1.5,"5 Things",2,2.5,"10 Things"
2,5,5.5,"10 Things",6,6.5,"20 Things"
Inc,a_One,a_Two,a_Three,b_One,b_Two,b_Three
3,9,9.5,"15 Things",10,10.5,"30 Things"
Мой желаемый результат представляет собой новый CSV, содержащий:
inc,label,one,two,three
1,"a",1,1.5,"5 Things"
2,"a",5,5.5,"10 Things"
3,"a",9,9.5,"15 Things"
1,"b",2,2.5,"10 Things"
2,"b",6,6.5,"20 Things"
3,"b",10,10.5,"30 Things"
В основном :
- строчных заголовки
- содрать префиксы заголовка и сохраните их, добавив их в новый столбец
- удалить повторы заголовков в последующих строках
- складывать каждый столбец, который разделяет последнюю часть их имен (например,
a_One
иb_One
значения должны быть объединены в один столбец). - Во время этого процесса сохраните значение
Inc
из исходной строки (в разных местах может быть несколько таких строк).
С оговорками:
- Я не знаю, имена столбцов загодя (много файлов, много разных столбцов). Они должны быть проанализированы, если они должны использоваться в качестве логики для удаления повторяющихся строк заголовка.
- Возможно наличие или не может быть более одного столбца с такими свойствами, как
Inc
, которые необходимо сохранить при складывании. Как правило,Inc
представляет собой любой столбец, который не имеет префикса, такого какa_
илиb_
. У меня есть регулярное выражение, чтобы вычеркнуть эти префиксы.
До сих пор я достиг этого:
> wip_path <- 'C:/path/to/horrible.csv'
> rawwip <- read.csv(wip_path, header = FALSE, fill = FALSE)
> rawwip
V1 V2 V3 V4 V5 V6 V7
1 Inc a_One a_Two a_Three b_One b_Two b_Three
2 1 1 1.5 5 Things 2 2.5 10 Things
3 2 5 5.5 10 Things 6 6.5 20 Things
4 Inc a_One a_Two a_Three b_One b_Two b_Three
5 3 9 9.5 15 Things 10 10.5 30 Things
> skips <- which(rawwip$V1==rawwip[1,1])
> skips
[1] 1 4
> filwip <- rawwip[-skips,]
> filwip
V1 V2 V3 V4 V5 V6 V7
2 1 1 1.5 5 Things 2 2.5 10 Things
3 2 5 5.5 10 Things 6 6.5 20 Things
5 3 9 9.5 15 Things 10 10.5 30 Things
> rawwip[1,]
V1 V2 V3 V4 V5 V6 V7
1 Inc a_One a_Two a_Three b_One b_Two b_Three
Но тогда, когда я пытаюсь применить TOLOWER() эти строки, я получаю:
> tolower(rawwip[1,])
[1] "4" "4" "4" "4" "4" "4" "4"
И это совершенно неожиданно.
Так что мои вопросы:
1) Как я могу получить доступ к струнам заголовка в rawwip[1,]
, так что я могу переформатировать их с tolower()
и другими струнными манипулированиями функциями?
2) Как только я это сделал, каков наиболее эффективный способ укладки столбцов с общими именами при сохранении значения inc
для каждой строки?
Имейте в виду, что будет более тысячи повторяющихся столбцов, которые могут быть отфильтрованы до, возможно, 20 разделяемых имен столбцов. Я не буду знать позицию каждого стекируемого столбца раньше времени. Это необходимо определить внутри скрипта.
Возможно, моя самая большая проблема с обучением R не в состоянии найти полную документацию. Например, в моих текущих ресурсах я не могу найти документацию на Map(), которую вы использовали выше. Не могли бы вы предоставить источник документации для этой функции? Google не помог. – Shawn
Внутри R просто введите '? Map', чтобы открыть документацию для этой функции. – MrFlick
Awesome. Это помогает, если я знаю, что я ищу. Куда идет, если они еще не знают, что они ищут? =) Я использовал индекс [здесь] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/), но ему не хватает определенных вещей, которые я нашел в другом месте. – Shawn