Si sente decisamente come ci dovrebbe essere una soluzione di base R per questo, ma il meglio che potevo fare era con tidyr
, alla prima di trasformare i dati in forma estesa, quindi filtrare solo per quelle osservazioni che corrispondono alla chiave desiderata.
data %>%
add_rownames("index") %>%
gather(var, value, -index, -key) %>%
filter(key == var)
Una soluzione R base che quasi così:
data[cbind(seq_along(data$key), data$key)]
per i dati, lo fa opere, ma perché utilizza una matrice, ha due gravi problemi. Uno è che l'ordine del fattore è importante, perché è solo la coercizione e la selezione delle colonne per livello di fattore, non per il nome della colonna. L'altro è che l'output risultante è un character
, non uno numeric
, perché nella conversione in una matrice, il tipo character
viene scelto a causa della colonna key
. Il problema principale è che non c'è data.frame
analogico al comportamento matrice di
Quando indicizzazione array di '[' un singolo argomento 'i' può essere una matrice con tante colonne quante sono le dimensioni di 'x' ; il risultato è quindi un vettore con elementi corrispondenti all'insieme di indici in ogni riga di "i".
Dati questi problemi, probabilmente andare con la soluzione tidyr
, poiché il fatto che le colonne sono mezzi variabilmente selezionabili che probabilmente rappresentano diverse osservazioni per la stessa unità osservabile.
Si potrebbe anche provare 'data [c (" x "," y "," z ")] [cbind (seq_len (nrow (dati)), corrisponde (dati $ chiave, nomi (dati))) ] 'per evitare il raggruppamento per ogni riga (con il costo, probabilmente inferiore, di una conversione intermedia in" matrice "). –
@alexis_laz Preferirei un approccio più estensibile che non richieda l'elencazione di ogni colonna. – sharoz
A seconda di come sono ordinate le colonne, ci dovrebbero essere molti modi per estrarre programmaticamente quelli necessari; 'data [1: 3]', 'data [unique (data $ key)]', 'data [! nomi (dati)% in%" chiave "]' etc –