2010-09-06 10 views
54

Tengo la siguiente trama de datos (df)Adición de una columna a una trama de datos en R

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 agregar a cada fila otra columna, con la media de los valores en los lugares correspondientes en vec. por ejemplo, la primera fila tendrá mean(vec[14379:32094]). He intentado jugar con transform, pero no pude realizar esta sencilla tarea.

+1

Estoy con un pie fuera de la oficina y no puedo dar un ejemplo tan rápido, pero FWIW, ¿ves? Aplicar. –

Respuesta

71

Eso es un caso de uso bastante 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 lo prefiere, pero aquí hay una verdadera necesidad de ir más allá de las funciones de R. base de

+0

+1 ¡Gracias! Re. 'plyr' - ¿cómo puedo usarlo si quiero que cada fila sea tratada por sí misma? –

+2

¿De qué estás hablando? Esto trata a cada uno por sí mismo. ¿De qué otro modo haría esto? –

+0

cada uno qué? por lo que yo entiendo, el trabajo 'plyr' en el grupo de filas. –

-1

Incluso si eso es una pregunta de hace 7 años, las personas nuevas en R deberían considerar usar el paquete data.table.

Un data.table es un data.frame así que todo lo que puede hacer para/a un data.frame también lo puede hacer. Pero muchos piensan que son ÓRDENES de magnitud más rápidas con 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] ]))] 
+0

no estoy seguro de por qué en la tierra me degradaron aquí ... ridículo – statquant

Cuestiones relacionadas