【问题标题】:What is the equivalent of " dplyr Mutate " in data.table , R ?什么是 data.table , R 中的“dplyr Mutate”等价物?
【发布时间】:2018-06-26 05:37:05
【问题描述】:

目标数据表如下:

#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 : 不包含“-”,则 TYPE 为“INN”。

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

第 3 步:改变其余 NA 行而不覆盖第 1 步和第 2 步结果

*如果 Col : GROUP 是 "P" 或 "R" , TYPE 是 "Other" ,第 1 步规则覆盖此规则。这就是为什么即使某些行在 Col : GROUP 中包含“P”或“R”,如果它们具有有效的 KEY,它们的 TYPE 也不会改变。

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

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

由于实际数据集包含 2 百万行,我需要一个更快的 实现这一点的方法。欢迎任何有效的脚本 总结三个只创建一列的笨拙脚本。

【问题讨论】:

    标签: r data.table dplyr


    【解决方案1】:

    如果我们使用data.table,请通过“KEY”与“RefDT”进行连接,分配(:= -类似于mutate)“RefDT”中的“TYPE”以创建“TYPE”列在“DT”中。如果没有匹配,则默认填充为NA。然后通过在i 中指定逻辑条件(grepl("-", NO) - 检查“NO”列中的-,检查“GROUP”中的“P”或“R”,其中“TYPE”为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
    

    数据

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

    【讨论】:

    • 非常感谢阿克伦!
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 2015-08-16
    • 2016-11-09
    • 2021-06-19
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多