Tengo el siguiente dataframe (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
.   .       .
.   .       .
.   .       .

Y un largo vector con los valores numéricos (vec).

Me gustaría añadir a cada fila de la otra columna, con la media de los valores en los lugares correspondientes en vec. por ejemplo, la primera fila se han mean(vec[14379:32094]). He intentado jugar con transform pero no era capaz de realizar esta sencilla tarea.

  • Estoy con un pie fuera de la oficina y no puede venir para arriba con un ejemplo tan rápido, pero por lo que vale, a ver ?se aplican.
InformationsquelleAutor David B | 2010-09-06

2 Comentarios

  1. 71

    Que es un bonito caso de uso estándar para 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> 

    También puede utilizar plyr si usted prefiere, pero aquí hay una verdadera necesidad de ir más allá de las funciones de la base de la R.

    • +1 Gracias! Re. plyr – ¿cómo puedo utilizar si quiero cada fila para ser tratado por sí mismo?
    • ¿De qué estás hablando? Este trata a cada uno de por sí. De qué otra manera se podría hacer esto?
    • cada qué? como tengo entendido, plyr trabajo en grupo de filas.
  2. 1

    Incluso si se trata de una de 7 años de edad pregunta, la gente nueva a R debe considerar el uso de la de datos.tabla, paquete.

    De datos.tabla de datos.marco para todo lo que usted puede hacer para/a de datos.marco también se puede hacer. Pero muchos piensan que son ÓRDENES de magnitud más rápido con los datos.tabla.

    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] ] ))]
    • no sé por qué en la tierra tengo votada abajo aquí… ridículo

Dejar respuesta

Please enter your comment!
Please enter your name here