To na pewno czuje się jak nie powinno być rozwiązaniem baza R do tego, ale najlepsze co mogłem zrobić to z tidyr
, najpierw przekształcić dane do szerokiej formy, a następnie filtruj tylko te obserwacje, które pasują do pożądanego klucza.
data %>%
add_rownames("index") %>%
gather(var, value, -index, -key) %>%
filter(key == var)
roztworze bazowym R, który praktycznie działa:
data[cbind(seq_along(data$key), data$key)]
dane podane, to nie działa, ale, ponieważ wykorzystuje się matrycę, ma dwie poważne problemy. Jednym z nich jest to, że kolejność czynnika ma znaczenie, ponieważ po prostu to wymusza i wybiera kolumny według poziomu czynnika, a nie według nazwy kolumny. Drugi jest taki, że wynik wyjściowy to character
, a nie numeric
, ponieważ przy konwersji do macierzy typ character
jest wybrany ze względu na kolumnę key
. Kluczowym problemem jest to, że nie ma data.frame
analogowo zachowania matrycy
podczas indeksowania tablice przez [ "pojedynczy argument„i”może być macierz jako liczbę kolumn są wymiary x ' ; wynikiem jest wektor z elementami odpowiadającymi zestawom indeksów w każdym rzędzie "i".
Biorąc pod uwagę te problemy, to pewnie go z roztworem tidyr
, ponieważ fakt, że kolumny są zmiennie wybieralne oznacza, że prawdopodobnie reprezentują różne spostrzeżenia dotyczące tej samej jednostce obserwowanej.
Możesz także spróbować "danych [c (" x "," y "," z ")] [cbind (seq_len (nrow (dane)), dopasowanie (klucz danych $, nazwy (dane))) ] ', aby uniknąć grupowania według każdego wiersza (z, prawdopodobnie, niższym kosztem konwersji pośredniej do" macierzy "). –
@alexis_laz Wolę bardziej rozszerzalne podejście, które nie wymaga umieszczenia w wykazie każdej kolumny. – sharoz
W zależności od sposobu uporządkowania kolumn, powinno być wiele sposobów programowego ich wyodrębnienia; 'dane [1: 3]', 'dane [unikalne (klucz danych $)]', 'dane [! nazwy (dane)% w%" klucz "]' itd. –