目标数据表如下:
#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:使用col:KEY查找另一个表中的TYPE信息
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
- 与KEY不匹配的行变为NA#
步骤2:创建下一组信息而不覆盖步骤1结果
*如果Col:No不包含“ - ”,则TYPE为“INN” .
DT[,TYPE:= ifelse(grepl("-",DT$No),"INN",TYPE)]
步骤3:改变NA行的其余部分而不覆盖步骤1和2的结果
*如果Col:GROUP为“P”或“R”,TYPE为“其他”,则步骤1规则覆盖此规则 . 这就是为什么即使某些行在Col:GROUP中包含“P”或“R”,如果它们具有有效的KEY,它们\ ir TYPE也不会改变 .
DT <- DT[is.na(TYPE),] %>% mutate(TYPE = ifelse(grepl("P|R",GROUP),"OTHER",TYPE)) %>%
rbind(DT[!is.na(TYPE),])
data.table中第3步的等效方法是什么?
由于实际数据集包含2百万行,我需要更快的方法来实现这一目标 . 欢迎使用任何有效的脚本来结束三个笨拙的脚本,只创建一个列 .
1 回答
如果我们使用的是
data.table
,请'KEY'与'RefDT'分配(:=
与mutate
相似)'RefDT'中的'TYPE'进行连接,以在'DT'中创建'TYPE'列 . 如果没有匹配项,则默认情况下将填充NA
. 然后通过在i
中指定逻辑条件来执行后续分配(grepl("-", NO)
- 在"NO"列中检查-
,在"GROUP"中检查"P"或"R",其中"TYPE"是NA
)数据