如何更新data.table中动态选择的列

时间:2018-06-29 02:17:35

标签: r data.table mutate

目标是在包含“ XX”或“ YY”的列上使用parse_number() (消除所有“逗号”)

# DT
DT <- data.table(C1 = c("12","14","94"),XX_C2 = 
c("12,1","14,0","94,1"),XX_C3 = c("52,33","44,9","194,1"),C4 = 
c("124","1","9"),ZZ_C5 = c("1132,3","1442,0","914,2"),ZZ_C5 = 
c("1532,3","1742,9","94,1"))

我有如下方法:(有效)

DT <- DT %>% 
  mutate_at(vars(grep("XX|YY",names(.), value = TRUE)), funs(parse_number))

对于大数据,如何以data.table的方式实现此目的,因为library(dplyr) %>%非常慢。

DT[,parse_number(.SD),.SDcols = list(grep("XX|YY",colnames(DT),value = TRUE))]

获取错误

DT[,grep("XX"|YY",colnames(DT),value = TRUE),with = FALSE]

可以动态选择列,但不知道如何将:=parse_number(x)应用于隐式列

2 个答案:

答案 0 :(得分:3)

您可以融化数据以提供一个value列,然后可以通过您的parse_number()函数进行传递。

## defining a 'parse_number' function
parse_number <- function(x) {
    as.numeric(gsub(pattern = ",",".",x))
}

cols <- names(DT)[grepl("^C", names(DT))]
dt <- melt(DT, id.vars = cols)[, value := parse_number(value)][]

dt
#     C1  C4 variable   value
#  1: 12 124    XX_C2   12.10
#  2: 14   1    XX_C2   14.00
#  3: 94   9    XX_C2   94.10
#  4: 12 124    XX_C3   52.33
#  5: 14   1    XX_C3   44.90
#  6: 94   9    XX_C3  194.10
#  7: 12 124    ZZ_C5 1132.30
#  8: 14   1    ZZ_C5 1442.00
#  9: 94   9    ZZ_C5  914.20
# 10: 12 124    ZZ_C5 1532.30
# 11: 14   1    ZZ_C5 1742.90
# 12: 94   9    ZZ_C5   94.10

注意:

在原始数据中,您有两列ZZ_C5-可能需要检查一下。

答案 1 :(得分:3)

如果我们使用parse_number中的readr,则在创建具有'XX或'ZZ'的列名称的索引之后,请在.SDcols中指定,在{{ 1}}(Data.table的子集),用.SD提取数字,并将输出分配(readr::parse_number)到同一列

:=

注意:在此示例中,有两列名称相同,即“ ZZ_C5”。不建议使用相同的列名,因为以后可能会出现问题。

library(data.table)
nm1 <- grep("XX|ZZ", names(DT))
DT[ , (nm1) := lapply(.SD, parse_number), .SDcols = nm1]
DT
#   C1 XX_C2 XX_C3  C4 ZZ_C5 ZZ_C5
#1: 12   121  5233 124 11323 15323
#2: 14   140   449   1 14420 17429
#3: 94   941  1941   9  9142   941