107 votes

Appliquer une fonction à chaque colonne spécifiée dans un tableau de données et mettre à jour par référence.

J'ai un tableau data.table avec lequel je voudrais effectuer la même opération sur certaines colonnes. Les noms de ces colonnes sont donnés dans un vecteur de caractères. Dans cet exemple particulier, je voudrais multiplier toutes ces colonnes par -1.

Quelques données de jouets et un vecteur spécifiant les colonnes pertinentes :

library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")

Pour l'instant, je le fais de cette façon, en bouclant sur le vecteur de caractères :

for (col in 1:length(cols)) {
   dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}

Existe-t-il un moyen de faire cela directement sans la boucle for ?

1voto

Dorian Grv Points 21

Pour ajouter un exemple permettant de créer de nouvelles colonnes à partir d'un vecteur de colonnes de type chaîne. Basé sur la réponse de Jfly :

dt <- data.table(a = rnorm(1:100), b = rnorm(1:100), c = rnorm(1:100), g = c(rep(1:10, 10)))

col0 <- c("a", "b", "c")
col1 <- paste0("max.", col0)  

for(i in seq_along(col0)) {
  dt[, (col1[i]) := max(get(col0[i])), g]
}

dt[,.N, c("g", col1)]

0voto

amonk Points 1522
library(data.table)
(dt <- data.table(a = 1:3, b = 1:3, d = 1:3))

Hence:

   a b d
1: 1 1 1
2: 2 2 2
3: 3 3 3

Whereas (dt*(-1)) yields:

    a  b  d
1: -1 -1 -1
2: -2 -2 -2
3: -3 -3 -3

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