web-dev-qa-db-fra.com

Ajout d'une colonne à un cadre de données dans R

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.

54
David B

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.

71
Dirk Eddelbuettel

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] ] ))]
1
statquant