2014-06-24 13 views
5

Supponiamo che io ho la seguente matrice:In Rcpp - come restituire un vettore con i nomi

testM <- as.matrix(read.table(textConnection(" 
1 5 4 1 3 2 
2 1 5 4 1 3 
2 2 1 5 4 1 
3 2 2 1 5 4 
1 3 2 2 1 5 
4 1 3 2 2 1 
1 5 4 1 3 2 
2 1 5 4 1 3 
2 2 1 5 4 1 
3 2 2 1 5 4 
1 3 2 2 1 5 
4 1 3 2 2 1 
"))) 

Questa matrice ha i nomi delle colonne V1-V6

Supponiamo che ci sia un'altra matrice dove ho rimuovere la colonna nome:

> testM2<-testM 
> colnames(testM2)<-NULL 

Poi se provo colMeans su testM e testM2 R ri trasforma una classe numeric in entrambi i casi, tranne che nel primo caso la risposta è colnames.

> colMeans(testM) 
     V1  V2  V3  V4  V5  V6 
2.166667 2.333333 2.833333 2.500000 2.666667 2.666667 
> colMeans(testM2) 
[1] 2.166667 2.333333 2.833333 2.500000 2.666667 2.666667 

Ora supponiamo di avere la stessa funzione scritta in RCpp come segue:

double do_mean(NumericVector x) { 
    return mean(na_omit(x)); 
} 

//[[Rcpp::export]] 
NumericVector colMeansCppMt(NumericMatrix& x) { 
    int nCols=x.ncol(); 
    NumericVector out=no_init(nCols); 
    for (int i=0;i<nCols;i++) { 
    NumericMatrix::Column tmp=x(_,i); 
    out[i]=do_mean(tmp); 
    } 
    return out; 
} 

L'uscita per colMeansCppMt sia per testM e testM2 ritorno vettori numerici, ma quello per testM non contiene il colnames come non è stato impostato.

Ora, supponiamo che io cambio la funzione di colMeansCppMt per includere attributi come questo:

//[[Rcpp::export]] 
NumericVector colMeansCppMt(NumericMatrix& x) { 
    int nCols=x.ncol(); 
    NumericVector out=no_init(nCols); 
    for (int i=0;i<nCols;i++) { 
    NumericMatrix::Column tmp=x(_,i); 
    out[i]=do_mean(tmp); 
    } 
    out.attr("names")=x.attr("names"); 
    return out; 
} 

L'uscita per testM è ancora un vettore che non contiene i nomi delle colonne.

Ho anche provato out.attr("names")=x.attr("colnames") e out.attr("colnames")=x.attr("colnames").

a). Come posso verificare in RCpp dove è stato impostato o no colnames di una matrice (ad esempio x nella funzione di esempio sopra)?

b). Come posso restituire un vettore numerico in R con i nomi in Rcpp?

risposta

3

Per impostare geografiche:

  1. regolari vettori R hanno un (opzionale) names attributo,
  2. data.frame s hanno un attributo row.names per le righe e names attributo per colonne, e
  3. matrix s avere un attributo (facoltativo) dimnames; questo attributo è un list contenente 2 vettori di caratteri (righe e colonne).

Quindi, ciò che si vuole è i nomi delle colonne di x attaccati al attributo 'nomi' di out, quindi qualcosa di simile:

out.attr("names") = VECTOR_ELT(x.attr("dimnames"), 1); 

avrebbe funzionato.

(non riesco a ricordare se Rcpp ha un bel API per ottenere/impostare nomi delle dimensioni in array ...)

Problemi correlati