2015-09-18 5 views
0

Я пытаюсь собрать информацию каталога на основе текстового поиска. Найдите определенную строку в столбце Text и поместите некоторое описание в новый столбец C_Organization.Как установить новый столбец на основе нескольких условий в data.table?

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

# load packages: 
pacman::p_load("data.table", 
       "stringr") 

# make sample data: 
DE <- data.table(c("John", "Sussan", "Bill"), 
       c("Text contains MIT", "some text with Stanford University", "He graduated from Yale")) 

colnames(DE) <- c("Name", "Text") 

> DE 
    Name        Text 
1: John     Text contains MIT 
2: Sussan some text with Stanford University 
3: Bill    He graduated from Yale 

поиск определенной строки и сделать новый data.table с новой колонки:

mit <- DE[str_detect(DE$Text, "MIT"), .(Name, C_Organization = "MIT")] 
yale <- DE[str_detect(DE$Text, "Yale"), .(Name, C_Organization = "Yale")] 
stanford <- DE[str_detect(DE$Text, "Stanford"), .(Name, C_Organization = "Stanford")] 

# bind them together: 
combine_table <- rbind(mit, yale, stanford) 

combine_table 

    Name C_Organization 
1: John   MIT 
2: Bill   Yale 
3: Sussan  Stanford 

Это погрузо-объединить подход работы отлично, но кажется немного утомительным. Можно ли сделать это за один шаг в data.table?

Редактировать

Из-за мое плохое мастерство анализа данных и нечистые данные, мне нужно, чтобы сделать этот вопрос ясный:

  1. реальных данные немного сложнее:

    (1) Есть случаи, когда человек из более чем двух организаций, например Jack, UC Berkeley, Bell lab. и

    (2) То же лицо этой же организации появляется в течение другого года, например Steven, MIT, 2011, Steven, MIT, 2014.

  2. Я хочу, чтобы выяснить:

    (1) Сколько людей от каждой организации. Если один человек принадлежит к нескольким организациям, создайте организацию, которая больше всего является его организацией. (т. е. по популярности.) Например, John, MIT, AMS, Bell lab, если MIT появляется 30 раз, AMS 12 раз, Bell lab 26 раз. Затем сделайте MIT своей организацией.

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

+0

вы имеете в виду у вас есть вектор 'v = с ("MIT", "Yale", "Стэнфорд")', и вы хотите, чтобы получить все строки в 'DE 'имея это в столбце' text'? –

+0

Да. Спасибо за вопрос. Вы высказали мой вопрос намного лучше. Я должен был упомянуть, что этот вектор может быть длиннее в реальном наборе данных. – Nick

+0

Ваш вызов 'pacman ::' снижает воспроизводимость вопроса. Вы можете использовать 'sapply (c (" pkg1 "," pkg2 "), require)' – jangorecki

ответ

0

Альтернативное решение, которое учитывает несколько матчей в одном тексте, работает построчно и связывает матчи вместе:

это дает:

> DE 
    Name         Text idx    c_org 
1: John      Text contains MIT 1    MIT 
2: Sussan  some text with Stanford University 2   Stanford 
3: Bill He graduated from Yale, MIT, Stanford. 3 MIT,Yale,Stanford 
4: Bill        some text 4     

Преимущество работы Роль очевидна, если у вас одинаковые имена в Name. Когда вы делаете:

DE[, uni[str_detect(Text, uni)], Name] 

вы получаете не правильный результат:

 Name  V1 
1: John  MIT 
2: Sussan Stanford 
3: Bill  MIT 
4: Bill Stanford 

=> Вы не знаете, какой Билл у вас есть в четвертом ряду. Кроме того, Yale не включен в «первый» счет (т. Е. Строка 3 исходного набора данных).


Б данные:

DE <- structure(list(Name = c("John", "Sussan", "Bill", "Bill"), Text = c("Text contains MIT", "some text with Stanford University", "He graduated from Yale, MIT, Stanford.", "some text")), .Names = c("Name", "Text"), row.names = c(NA, -4L), class = c("data.table", "data.frame")) 
+0

Спасибо за ваш ответ. Можете ли вы объяснить, как работает 'uni [str_detect (Text, uni)]'? – Nick

+0

@Nick Он возвращает значение из вектора 'uni', для которого есть совпадение в столбце« Текст ». – Jaap

+0

Итак, 'uni [True, False, True]' возвращает 'MIT, Stanford'? Как вектор принимает логическое значение и возвращает его элементы? – Nick

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