2015-04-24 7 views
0

Я новичок в R и борюсь с построением набора данных из коллекции музея.Создание кадра данных путем анализа символьных векторов в R

После выскабливания их веб-сайта, у меня есть список векторов символов (скажем, название «характеристика»), в котором каждый элемент выглядит следующим образом:

[[4729]] 
[1] " Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto" 

из этих векторов, я хочу сделать dataframe который выглядит следующим образом:

 year medium   dimensions credit line number 
1 2002  Pencil on paper etc... 

Однако, я не могу показаться, чтобы суметь вычитать необходимые данные из векторов символов, как я борюсь с регулярными выражениями, чтобы сделать это. Идея состояла бы в том, чтобы получить то, что происходит после «Date: //» и до «Medium: //». Чтобы усложнить ситуацию, не все элементы в списке имеют одни и те же характеристики в одном порядке (например, некоторые элементы имеют только «дату» и «средний», в то время как другие включают «издание: //», «приобретенное через: //», , и т.д).

Список лет было довольно легко собрать, просто сохраняя первые 4 цифры в каждом элементе списка:

year <- list() 

for(p in 1:length(characteristics)) { 
    string <- as.character(characteristics[p]) 
    year <- c(year, str_extract(string, "\\d\\d\\d\\d")) 
    } 

Это, вероятно, даже не самый быстрый способ сделать это, но это делает работу Что ж. Однако я полностью застрял на извлечении других переменных из списка.

+0

Любой шанс предварительной обработки с помощью 'awk' или что-то разрешено? – ShellFish

+0

Вы можете выделить строку, а затем использовать 'gsub', чтобы удалить первую совпадающую часть. Соответствуйте этому регулярному выражению на каждом шаге:' [a-zA-Z] *: \/\/\ ([^ \ /] * \) [A-Za-Z] * \/\/'. Помните, что это регулярное выражение находится в синтаксисе sed. Существует групповой захват, содержащий нужную вам информацию, доступ к ней с помощью '\ 1' или' \\ 1', я верю в 'R'. – ShellFish

+0

Знаете ли вы доступные варианты для диапазона характеристик? – A5C1D2H2I1M1N2O1R2T1

ответ

0

Может быть, старый добрый read.table вариант тоже:

txt <- c("Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto", 
     "Date://2002 Medium://Pencil on paper Dimensions://22 1/2 x 30 1/8\" (57.2 x 76.5 cm) Credit Line://The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA Number://1563.2005 Copyright://© 2015 Steve DiBenedetto") 
read.table(text = gsub("(Credit)?\\s?[A-z]+://", "\t", txt), sep = "\t", quote = "", col.names = letters[1:7])[-1] 
#  b    c         d                   e  f      g 
# 1 2002 Pencil on paper 22 1/2 x 30 1/8" (57.2 x 76.5 cm) The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA 1563.2 © 2015 Steve DiBenedetto 
# 2 2002 Pencil on paper 22 1/2 x 30 1/8" (57.2 x 76.5 cm) The Judith Rothschild Foundation Contemporary Drawings Collection Gift MoMA 1563.2 © 2015 Steve DiBenedetto 
+0

Это близко @lukeA! Однако некоторые проблемы все еще стоят: мы теряем информацию о том, какую характеристику мы сохраняем (например, «средний»). Различные работы имеют разные характеристики, поэтому я должен иметь возможность сохранять характеристики под правильным названием столбца. Таким образом, хранящаяся информация должна храниться в столбце с именем перед символом ': //' (например, «medium»). У меня нет списка диапазона характеристик, например, @Anando Mahto. Всякий раз, когда мы сталкиваемся с новым тегом перед ': //', с этим именем должен быть создан новый столбец. – willemr

Смежные вопросы