2010-03-30 15 views
24

¿Qué sucede si se quiere apply una función, es decir, para cada fila de una matriz, pero también quiere usar como argumento para esta función el número de esa fila. Como ejemplo, suponga que desea obtener la raíz n-ésima de los números en cada fila de una matriz, donde n es el número de fila. ¿Hay alguna otra forma (usando apply solamente) que el enlace de columna de los números de fila a la matriz inicial, así?Contador de filas/columnas en funciones 'aplicar'

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 

t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1]))) 

P.S. En realidad, si prueba era realmente una matriz: test <- matrix(c(26,21,20,34,29,28),nrow=3), rownames (prueba) no ayuda :( Gracias

+0

Tenga en cuenta que en su ejemplo no necesita la aplicación! –

+0

Sí, puedo ver eso :) En realidad, quería dibujar algunas líneas en un diagrama en las posiciones asociadas con el número de línea. – Brani

Respuesta

26

Lo que suelo hacer es ejecutar sapply en los números de fila en lugar de 1:nrow(test)test, y utilizan test[i,]. dentro de la función:.

t(sapply(1:nrow(test), function(i) test[i,]^(1/i))) 

no estoy seguro de que esto es realmente eficiente, aunque

+0

El único inconveniente de esto es que si la función es complicada, no puede reutilizarla fácilmente con diferentes dataframes. Pero estoy de acuerdo en pasar un vector de las posiciones y luego usar eso para indexar es el camino a seguir. –

+0

Atención: si nrow (prueba) == 0, esto pasará de 1 a 0 y la prueba [i,] fallará – PeterVermont

2

en realidad, en el caso de una matriz, que ni siquiera necesita apply Justo:.

test^(1/row(test)) 

hace lo que quiere, creo. Creo que la función row() es lo que estás buscando.

+0

Estoy de acuerdo, pero consulte los comentarios debajo de la pregunta. – Brani

+1

Sí, pero sigo pensando que la función "row()" es exactamente lo que necesita. – darrenjw

+0

Todavía no puedo ver cómo puedo dar un comando 'lines' como este ' líneas (prueba [i,], c (i, i)) 'sin una aplicación o un ciclo for. 'lines (CI, row (CI))' no funciona – Brani

1

cbind() El número de filas parece un enfoque bastante directo. Para una matriz (o una trama de datos), debe funcionar lo siguiente:

apply(cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1])) 

o lo que sea que desee trazar.

3

Si le da un nombre a la función en lugar de anonimizarla, puede pasar argumentos más fácilmente. Podemos usar nrow para obtener el número de filas y pasar un vector de los números de fila como un parámetro, junto con el marco que se indexará de esta manera.

Para mayor claridad utilicé una función de ejemplo diferente; este ejemplo se multiplica x columna por columna y por una matriz columna 2:

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 
myfun <- function(position, df) { 
    print(df[position,1] * df[position,2]) 
} 

positions <- 1:nrow(test) 
lapply(positions, myfun, test) 
0

Estoy un poco confundir por lo que me disculpe si me da este mal, pero desea trabajar enésima raíz de los números en cada fila de una matriz donde n = el número de fila. Si esto este el caso, entonces su muy simple crear una nueva matriz con las mismas dimensiones que el original con cada columna que tiene los mismos valores que el correspondiente número de fila:

test_row_order = array(seq(1:length(test[,1]), dim = dim(test)) 

Después, simplemente aplicar una función de (la n-ésima raíz en este caso):

n_root = test^(1/test_row_order)