代码之家  ›  专栏  ›  技术社区  ›  rane

在data.table,r中,“dplyr mutate”的等价物是什么?

  •  1
  • rane  · 技术社区  · 8 年前

    目标数据表如下:

    #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从另一个表中查找类型信息

    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:no contain“-”,则类型为“inn”。

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

    步骤3:在不覆盖步骤1和2结果的情况下对其余NA行进行变异

    *如果col:group为“p”或“r”,则类型为“other”,则步骤1规则将覆盖此规则。这就是为什么即使某些行在col:group中也包含“p”或“r”,如果它们有有效的键,它们的类型也不会改变。

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

    data.table中步骤3的等效方法是什么?

    因为实际数据集包含200万行,所以我需要更快的 实现这一点的方法。欢迎使用任何有效的脚本 总结三个只创建一列的笨拙脚本。

    1 回复  |  直到 8 年前
        1
  •  2
  •   akrun    8 年前

    如果我们使用 data.table ,使用“refdt”赋值执行“key”联接( := -类似于 mutate )“refdt”中的“type”用于在“dt”中创建“type”列。如果没有匹配项,默认情况下将用 NA .然后通过在中指定逻辑条件来执行后续分配。 i ( grepl("-", NO) -检查 - 在“否”列中,检查“类型”所在的“组”中的“P”或“R” 不适用 )

    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
    

    数据

    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))