tablas - Contador de filas/columnas en las funciones de ''aplicar''
matrices en r studio (5)
¿Qué pasa si uno quiere apply
una función, es decir, a 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 otra forma (utilizando apply
solo) que unir con columnas los números de fila a la matriz inicial, como esto?
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])))
PS En realidad, si la prueba era realmente una matriz: test <- matrix(c(26,21,20,34,29,28),nrow=3)
, rownames (prueba) no ayuda :( Gracias.
En realidad, en el caso de una matriz, ni siquiera es necesario apply
. Sólo:
test^(1/row(test))
hace lo que quieras, creo. Creo que la función row()
es lo que estás buscando.
Estoy un poco confundido, así que discúlpeme si me equivoco, pero quiere calcular la enésima raíz de los números en cada fila de una matriz donde n = el número de la fila. Si este es el caso, entonces es realmente sencillo crear una nueva matriz con las mismas dimensiones que el original con cada columna que tenga los mismos valores que el número de fila correspondiente:
test_row_order = array(seq(1:length(test[,1]), dim = dim(test))
Luego simplemente aplique una función (la raíz n-th en este caso):
n_root = test^(1/test_row_order)
Lo que normalmente hago es ejecutar sapply
en los números de fila 1:nrow(test)
lugar de test
, y usar la test[i,]
dentro de la función:
t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))
Aunque no estoy seguro de que esto sea realmente eficiente.
Si le da a la función un nombre en lugar de hacerlo anónimo, puede pasar los 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 cuadro que se va a indexar de esta manera.
Para mayor claridad utilicé una función de ejemplo diferente; este ejemplo multiplica la columna x por la columna y para una matriz de 2 columnas:
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)
cbind()
los números de las filas parece un enfoque bastante sencillo. Para una matriz (o un marco de datos) lo siguiente debería funcionar:
apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )
o lo que quieras trazar.