Opérations avec data table : utiliser le paramètre .SD avec une fonction renvoyant un vecteur ou une liste
aperçu de la séquenceLe package data.table
permet de réaliser des appels de fonction quelconques par groupe de lignes.
L'appel
dt[ j=f(.SD), by=col]
Envoie à la fonction f
, une section de dt
correspondant à chaque valeur distincte de col
. Le résultat en retour dépend de ce que renvoie f
.
mtcars
mt= data.table(mtcars)
myrange1 = function(sd){
a = sd[ j=range(mpg)]
a[2] - a[1]
}
mt[ j=myrange1(.SD),by="am"]
## am V1
## 1: 1 18.9
## 2: 0 14.0
Dans ce cas, SD
est optionnel, le code de l'exemple 1 est identique à
mt[ j=max(mpg)-min(mpg),by="am"]
## am V1
## 1: 1 18.9
## 2: 0 14.0
myrange2 = function(sd){
a = sd[ j=range(mpg)]
a
}
La fonction myrange2
renvoie un vecteur.
am
dans la hauteur correspondant aux 2 valeurs min et maxam
mt[ j=myrange2(.SD),by="am"]
## am V1
## 1: 1 15.0
## 2: 1 33.9
## 3: 0 10.4
## 4: 0 24.4
myrange3 = function(sd){
# la fonction renvoie une liste de vecteurs de longueur 1
a = sd[ j=range(mpg)]
b = as.list(a)
names(b)=c("min","max")
b$range = a[2]-a[1]
b
}
La fonction myrange3
renvoie une liste de vecteurs de longueur 1
myrange3
mt[ j=myrange3(.SD),by="am"]
## am min max range
## 1: 1 15.0 33.9 18.9
## 2: 0 10.4 24.4 14.0
myrange4 = function(sd){
# la fonction renvoie une liste de vecteurs de longueur > 1, et inégales
a = sd[ j=range(mpg)]
b = list(ext=a,side=c("min","max"))
b$range = a[2]-a[1]
b
}
La fonction myrange4
renvoie une liste de vecteurs de longueurs inégales > 1
mt[ j=myrange4(.SD),by="am"]
## am ext side range
## 1: 1 15.0 min 18.9
## 2: 1 33.9 max 18.9
## 3: 0 10.4 min 14.0
## 4: 0 24.4 max 14.0