Как обновить динамически выбранный столбец в data.table - PullRequest
0 голосов
/ 29 июня 2018

Цель состоит в том, чтобы использовать parse_number() в столбцах, которые содержат «XX» или «YY» (исключить все запятые)

# 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 голосов
/ 29 июня 2018

Если мы используем parse_number из readr, после создания индекса имен столбцов, имеющих 'XX или' ZZ ', укажите, что в .SDcols циклически перебирается .SD (Подмножество данных. таблица), извлеките числа с помощью readr::parse_number и присвойте (:=) выходные данные тем же столбцам

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

ПРИМЕЧАНИЕ. В этом примере есть два столбца с одинаковыми именами, т.е. "ZZ_C5". Не рекомендуется иметь такие же имена столбцов, поскольку это может создать проблемы позже.

setnames(DT, make.unique(names(DT)))
0 голосов
/ 29 июня 2018

Вы можете растопить данные, чтобы получить столбец 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 - возможно, захотите проверить это.

...