J'ai le dataframe suivant (df
)
start end
1 14379 32094
2 151884 174367
3 438422 449382
4 618123 621256
5 698271 714321
6 973394 975857
7 980508 982372
8 994539 994661
9 1055151 1058824
. . .
. . .
. . .
Et un long vecteur avec des valeurs numériques (vec
).
Je voudrais ajouter à chaque ligne une autre colonne, avec la moyenne des valeurs aux emplacements correspondants dans vec
. Par exemple, la première ligne aura mean(vec[14379:32094])
. J'ai essayé de jouer avec transform
mais je n'ai pas pu accomplir cette tâche simple.
C’est un cas d’utilisation plutôt classique pour apply()
:
R> vec <- 1:10
R> DF <- data.frame(start=c(1,3,5,7), end=c(2,6,7,9))
R> DF$newcol <- apply(DF,1,function(row) mean(vec[ row[1] : row[2] ] ))
R> DF
start end newcol
1 1 2 1.5
2 3 6 4.5
3 5 7 6.0
4 7 9 8.0
R>
Vous pouvez également utiliser plyr
si vous préférez, mais vous n'avez pas vraiment besoin d'aller au-delà des fonctions de la base R.
Même s'il s'agit d'une question vieille de 7 ans, les nouveaux venus dans R devraient envisager d'utiliser le package data.table ,.
Data.table est un data.frame, vous pouvez donc tout faire pour un data.frame. Mais beaucoup pensent que les commandes sont plus rapides avec data.table.
vec <- 1:10
library(data.table)
DT <- data.table(start=c(1,3,5,7), end=c(2,6,7,9))
DT[,new:=apply(DT,1,function(row) mean(vec[ row[1] : row[2] ] ))]