2010-03-30 3 views
24

Cosa succede se si desidera apply una funzione, ad ogni riga di una matrice, ma si desidera anche utilizzare come argomento per questa funzione il numero di tale riga. Ad esempio, si supponga di voler ottenere la n-esima radice dei numeri in ciascuna riga di una matrice, dove n è il numero di riga. C'è un altro modo (usando solo apply) di legare la colonna i numeri di riga alla matrice iniziale, come questo?Contatore riga/colonna nelle funzioni 'applica'

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. In realtà se prova è stato davvero una matrice: test <- matrix(c(26,21,20,34,29,28),nrow=3), rownames (test) non aiuta :( Grazie

+0

Nota che nel tuo esempio non hai bisogno dell'applicazione! –

+0

Sì, posso vederlo :) In realtà volevo disegnare delle linee su un tracciato in posizioni associate al numero di linea. – Brani

risposta

26

Cosa faccio di solito è quello di eseguire sapply sui numeri di riga 1:nrow(test) invece di test, e utilizzare test[i,]. all'interno della funzione:.

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

non sono sicuro che questo è davvero efficiente, anche se

+0

L'unico svantaggio di questo è che se la funzione è complicata, non è possibile riutilizzarla facilmente con diversi dataframes. Ma sono d'accordo a passare un vettore delle posizioni e poi usarlo per indicizzare è la strada da percorrere. –

+0

Attento - if nrow (test) == 0 allora questo passerà da 1 a 0 e il test [i,] fallirà – PeterVermont

2

in realtà, nel caso di una matrice, non è nemmeno necessario apply Just:.

test^(1/row(test)) 

fa quello che vuoi, penso. Penso che la funzione row() sia la cosa che stai cercando.

+0

Sono d'accordo, ma guarda i commenti sotto la domanda. – Brani

+1

Sì, ma continuo a pensare che la funzione "row()" sia esattamente ciò di cui hai bisogno. – darrenjw

+0

Ancora non riesco a vedere come posso dare un comando 'lines' come questo ' lines (test [i,], c (i, i)) 'senza un ciclo apply o for. 'lines (CI, row (CI))' non funziona – Brani

1

cbind() il numero di riga sembra un approccio piuttosto semplice. Per una matrice (o un frame di dati) dovrebbe funzionare:

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

o qualsiasi altra cosa si desideri stampare.

3

Se si attribuisce alla funzione un nome anziché renderlo anonimo, è possibile passare più facilmente gli argomenti. Possiamo usare nrow per ottenere il numero di righe e passare un vettore dei numeri di riga come parametro, insieme al fotogramma da indicizzare in questo modo.

Per chiarezza, ho utilizzato una funzione di esempio diversa; questo esempio moltiplica colonna per colonna x y per una matrice 2 colonne:

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

Sono un po 'confuso così mi scusi se ho questo torto, ma si desidera lavorare fuori n-esima radice dei numeri in ogni riga di una matrice dove n = il numero di riga. Se questo questo caso quindi la sua davvero semplice creare un nuovo array con le stesse dimensioni dell'originale con ogni colonna avente gli stessi valori del corrispondente numero di riga:

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

Quindi applicare semplicemente una funzione (la n-esima root in questo caso):

n_root = test^(1/test_row_order)