2015-08-27 8 views
1

У меня есть большой набор данных для студентов, где существуют нестандартные соглашения об именах для учеников с отличием. Мне нужно создать/заполнить новый столбец, который будет возвращать Y или N для соответствия строк на основе слова «с отличием»выделить значения в новый столбец на основе соответствия логической строки в data.table

То есть в настоящее время мои данные выглядит примерно так с более чем 200 000 студентов

library(data.table) 
students<-data.table(Student_ID = c(10001:10005), 
        Degree= c("Bachelor of Laws", "Honours Degree in Commerce", "Bachelor of Laws (with Honours)", "Bachelor of Nursing with Honours", "Bachelor of Nursing")) 

Мне нужно добавить третью колонку таким образом, что после того, как создать новый столбец «Отличник» таблица данных способом, он будет заполняться так:

students<-data.table(Student_ID = c(10001:10005), 
         Degree= c("Bachelor of Laws", "Honours Degree in Commerce","Bachelor of Laws (with Honours)", "Bachelor of Nursing with Honours", "Bachelor of Nursing"), 
         Honours = c("N","Y", "Y", "Y","N")) 

Любая помощь будет принята с благодарностью.

Кроме того, с помощью таблицы данных, как я имею в виду:

students[,Honours:="N"] 
+0

Вы можете сделать это пошаговым для удобного чтения: 'idx <- grepl (« honors », students $ Degree, ignore.case = TRUE); студенты [idx, Honors: = "Y"]; students [! idx, Honors: = "N"] ' –

ответ

6

Это довольно просто на самом деле

students[, Honours := c("N", "Y")[grepl("Honours", Degree, fixed = TRUE) + 1L]] 

Все, что вам нужно сделать, это найти «Почести» с помощью некоторой функции реализации регулярных выражений, таких как grepl (это не настоящее выражение, поэтому вы можете повысить производительность с помощью fixed = TREU), а затем просто выполните векторное подмножество от c("N", "Y") согласно вашим выводам (a TRUE/FALSE логический вектор + 1L, который преобразует его в вектор 1,2, который будет использоваться для вычитать значения из c("N", "Y"))


В качестве альтернативы, если это слишком трудно прочесть, вы можете использовать ifelse вместо

students[, Honours := ifelse(grepl("Honours", Degree, fixed = TRUE), "Y", "N")] 

если, конечно, «Почести» может появиться в различных вариантах случае вы можете переключить grepl вызов grepl("Honours", Degree, ignore.case = TRUE)


P.S.

Я предлагаю придерживаться логического вектора, хотя, потому что вы можете легко манипулировать ею после

Например

students[, Honours := grepl("Honours", Degree, fixed = TRUE)] 

Теперь, если вы хотите выбрать только ребята с «отличием», вы можете вобще

students[(Honours)] 
# Student_ID       Degree Honours 
# 1:  10002  Honours Degree in Commerce TRUE 
# 2:  10003 Bachelor of Laws (with Honours) TRUE 
# 3:  10004 Bachelor of Nursing with Honours TRUE 

Или ребята без "Почести"

students[!(Honours)] 
# Student_ID    Degree Honours 
# 1:  10001 Bachelor of Laws FALSE 
# 2:  10005 Bachelor of Nursing FALSE 
+0

Вы также можете использовать более простой оператор'% like% 'из' data.table', хотя это просто оболочка над 'grepl'. – Eric

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

  • Нет связанных вопросов^_^