2 votes

Comment mettre à jour la colonne sélectionnée dynamiquement dans data.table ?

L'objectif est d'utiliser parse_number() sur les colonnes qui contiennent "XX" ou "YY". (éliminez toutes les "virgules")

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

J'ai l'approche suivante : (cela fonctionne)

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

Comment réaliser ceci dans la manière data.table comme library(dplyr) %>% est très lent pour les grandes données.

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

Obtenir une erreur

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

Je peux sélectionner la colonne dynamiquement mais je ne sais pas comment l'appliquer. := con parse_number(x) sur les colonnes implicites

3voto

SymbolixAU Points 15470

Vous pouvez faire fondre les données pour vous donner un value que vous pouvez ensuite faire passer par votre parse_number() fonction.

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

Nota:

Dans vos données d'origine, vous avez deux colonnes ZZ_C5 - peut vouloir vérifier ceci.

3voto

akrun Points 148302

Si nous utilisons parse_number de readr après avoir créé l'index des noms de colonnes qui ont 'XX ou 'ZZ', spécifiez que dans le champ .SDcols , boucle à travers le .SD (Sous-ensemble de Data.table), extraire les chiffres avec readr::parse_number et attribuer ( := ) la sortie vers les mêmes colonnes

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

NOTE : Dans l'exemple, il y a deux colonnes avec le même nom, c'est-à-dire "ZZ_C5". Il n'est pas recommandé d'avoir les mêmes noms de colonnes car cela peut créer des problèmes par la suite.

setnames(DT, make.unique(names(DT)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X