2015-09-17 3 views
0

Я хочу использовать списки выражений для кодирования нового поля.Использование списков шаблонов для кодирования нового поля

В моей информационной структуре Bisaccategory1 содержит полное описание категории книг. Конкретные строки, представляющие частичные значения в этом поле, могут использоваться для определения нового поля под названием «Жанр». Один конкретный жанр будет «научной», который отображает 25 уникальных полных описаний. Я могу идентифицировать эти полные описания, указав определенные закономерности, которые содержатся в них:

nonfiction<-c("BIOGRAPHY & AUTOBIOGRAPHY","BODY, MIND & SPIRIT","BUSINESS & ECONOMICS","COMICS & GRAPHIC NOVELS", 
        "COMPUTERS","COOKING","FAMILY & RELATIONSHIPS","HEALTH & FITNESS","HISTORY","HOUSE & HOME","HUMOR", 
        "LITERARY CRITICISM","NATURE","PERFORMING 
ARTS","PETS","PHOTOGRAPHY","POETRY","POLITICAL SCIENCE","RELIGION", 
         "SCIENCE","SELF-HELP","SOCIAL SCIENCE","SPORTS & RECREATION","TRANSPORTATION","TRUE CRIME") 

я могу затем сопоставить эти строки для завершения значения Biscategory1 следующим образом:

matches <- unique (grep(paste(nonfiction,collapse="|"), 
           detail$Bisaccategory1, value=TRUE)) 

Но я неясно о том, как использовать эти «совпадения», чтобы присвоить значение «неопубликование» моему новому жанровому полю.

Это образец данных:

structure(list(Author = c("James Swallow", "Billy Crystal", "Mark Divine", 
"Charles Cumming", "Victoria Schwab", "Louise Penny", "Elizabeth Warren", 
"Linda Castillo", "Paul Fischer", "Sandy Hall", "Louise Penny", 
"Louise Penny", "Lisa Scottoline", "Linda Castillo", "Evan Osnos", 
"Porter Erisman"), Title = c("24: Deadline", "700 Sundays - Still Foolin' 'Em", 
"8 Weeks to Sealfit", "A Colder War", "A Dark Shade of Magic", 
"A Fatal Grace", "A Fighting Chance", "A Hidden Secret", "A Kim Jong-Il Production", 
"A Little Something Different", "A Rule Against Murder", "A Trick of the Light", 
"Accused", "After the Storm", "Age of Ambition", "Alibaba's World" 
), Bisac = c("FICTION/Thrillers/General", "BIOGRAPHY & AUTOBIOGRAPHY/Entertainment & Performing Arts", 
"HEALTH & FITNESS/Exercise", "FICTION/Thrillers/Espionage", 
"FICTION/Fantasy/Historical", "FICTION/Mystery & Detective/Traditional", 
"BIOGRAPHY & AUTOBIOGRAPHY/Political", "FICTION/Mystery & Detective/Police Procedural", 
"HISTORY/Asia/Korea", "JUVENILE FICTION/Love & Romance", 
"FICTION/Mystery & Detective/Traditional", "FICTION/Mystery & Detective/Traditional", 
"FICTION/Thrillers/Legal", "FICTION/Mystery & Detective/Police Procedural", 
"HISTORY/Asia/China", "BUSINESS & ECONOMICS/E-Commerce/General" 
)), .Names = c("Author", "Title", "Bisac"), class = "data.frame", row.names = c(NA, 
-16L)) 

Я знаю, что я могу сделать что-то вроде:

df$Genre[Bisaccategory1=="BODY, MIND & SPIRIT/Inspiration & Personal Growth"]<-"nonfiction" 

, но у меня есть сотни категорий, и это на самом деле не масштабируется. Буду признателен за любые предложения.

ответ

2

Вместо grep функция grepl вернет логический индекс, в котором были сделаны совпадения. Вы можете использовать это для подмножества столбца «Жанр». Я назначил записи, которые не были «нехудожественными» для вымысла, но вы можете сделать их как хотите.

matches <- grepl(paste(nonfiction,collapse="|"), detail$Bisac) 
detail$Genre <- "fiction" 
detail$Genre[matches] <- "non-fiction" 
# Bisac  Genre 
# 1        FICTION/Thrillers/General  fiction 
# 2 BIOGRAPHY & AUTOBIOGRAPHY/Entertainment & Performing Arts non-fiction 
# 3         HEALTH & FITNESS/Exercise non-fiction 
# 4        FICTION/Thrillers/Espionage  fiction 
# 5        FICTION/Fantasy/Historical  fiction 
# 6     FICTION/Mystery & Detective/Traditional  fiction 
# 7      BIOGRAPHY & AUTOBIOGRAPHY/Political non-fiction 
0
library(dplyr) 
library(tidyr) 
library(stringi) 

non_fiction_books = 
    detail %>% 
    mutate(Bisac = Bisac %>% stri_split_fixed("/")) %>% 
    unnest(Bisac) %>% 
    mutate(Bisac = Bisac %>% stri_trans_toupper) %>% 
    right_join(data_frame(Bisac = non_fiction)) %>% 
    select(-Bisac) %>% 
    distinct 
Смежные вопросы