Что эквивалентно dplyr Mutate в data.table, R? - PullRequest
0 голосов
/ 26 июня 2018

Таблица целевых данных, как показано ниже:

#DT
NO    GROUP   KEY          TYPE  <--- Create this column
12-19  N      1701         INN
10-20  N      1602         INN
13     P      1501John     BANK
14     R      1408Mary     POOL
15     G      1408Peter    PARK
19     K      1408Paul     BANK
25     P      1708         OTHER
36     R      1503         OTHER

Шаг 1: Поиск информации TYPE из другой таблицы с помощью col: KEY

DT[,"TYPE":= RefDT[match(DT$KEY,Ref$KEY),2]]

# RefDT like below :

KEY          TYPE
1609TOM      PARK
1501John     BANK
1408Mary     POOL
1408Peter    PARK
1408Paul     BANK
1309Sue      POOL
  • Строки, которые не соответствуютКЛЮЧ становится NA #

Шаг 2: Создайте следующую информацию о группе без перезаписи результата шага 1

* Если Col: Нет, содержит «-», TYPE - «INN».

DT[,TYPE:= ifelse(grepl("-",DT$No),"INN",TYPE)]

Шаг 3: Измените остальные строки NA без перезаписи. Результат шага 1 и 2

* Если Col: GROUP равен «P» или «R», TYPE - «Другой», Шаг 1правило переопределить это правило.Вот почему даже некоторые строки содержат «P» или «R» в Col: GROUP, они \ ir TYPE не изменятся, если у них будет эффективный KEY.

DT <- DT[is.na(TYPE),] %>% mutate(TYPE = ifelse(grepl("P|R",GROUP),"OTHER",TYPE)) %>%
  rbind(DT[!is.na(TYPE),])

Каков эквивалентный подход шага 3 вdata.table?

Поскольку фактический набор данных содержит 2 миллиона строк, мне нужны более быстрые методы для достижения этой цели.Добро пожаловать в любой эффективный сценарий, чтобы завершить три неуклюжих сценария для создания только одного столбца.

1 Ответ

0 голосов
/ 26 июня 2018

Если мы используем data.table, выполните объединение с помощью 'KEY' с назначением 'RefDT' (:= - аналогично mutate) 'TYPE' в 'RefDT', чтобы создать столбец 'TYPE'в 'DT'.Если совпадений нет, по умолчанию он будет заполнен NA.Затем выполните последующие присвоения, указав логическое условие в i (grepl("-", NO) - проверьте на - в столбце «НЕТ», проверьте «P» или «R» в «ГРУППЕ», где «ТИП»NA)

setDT(DT)[RefDT, TYPE := TYPE, on = .(KEY)]
DT[grepl("-", NO), TYPE := "INN"
       ][is.na(TYPE) & grepl("P|R", GROUP), TYPE := "OTHER"][]
#      NO GROUP       KEY  TYPE
#1: 12-19     N      1701   INN
#2: 10-20     N      1602   INN
#3:    13     P  1501John  BANK
#4:    14     R  1408Mary  POOL
#5:    15     G 1408Peter  PARK
#6:    19     K  1408Paul  BANK
#7:    25     P      1708 OTHER
#8:    36     R      1503 OTHER

data

DT <- structure(list(NO = c("12-19", "10-20", "13", "14", "15", "19", 
"25", "36"), GROUP = c("N", "N", "P", "R", "G", "K", "P", "R"
), KEY = c("1701", "1602", "1501John", "1408Mary", "1408Peter", 
"1408Paul", "1708", "1503")), .Names = c("NO", "GROUP", "KEY"
), row.names = c(NA, -8L), class = "data.frame")


RefDT <- structure(list(KEY = c("1609TOM", "1501John", "1408Mary", "1408Peter", 
"1408Paul", "1309Sue"), TYPE = c("PARK", "BANK", "POOL", "PARK", 
"BANK", "POOL")), .Names = c("KEY", "TYPE"), 
 class = "data.frame", row.names = c(NA, 
-6L))
...