2012-06-21 8 views
5

Mam ramkę danych, która odnosi numery butelek do ich objętości (key w poniższym przykładzie). Chcę napisać funkcję, która zajmie się dowolną listą numerów butelek (samp) i zwróci listę pojemności butelek , zachowując kolejność numerów butelek w samp.Jak scalić i zachować kolejność rzędów jednego wejścia?

Poniższa funkcja poprawnie dopasowuje numery butelek i objętości, ale sortuje dane wyjściowe według rosnącego numeru butelki.

Jak zachować kolejność samp z merge? Ustawienie sort=FALSE powoduje "nieokreśloną kolejność".

Przykład

samp <- c(9, 1, 4, 1) 
num <- 1:10 
vol <- sample(50:100, 10) 
key <- data.frame(num, vol) 
matchFun <- function(samp, key) 
    { 
    out <- merge(as.data.frame(samp), key, by.x="samp", by.y="num") 
    return(out$vol) 
    } 
+2

Poważnie? Jest w instrukcji. Przeczytaj '? Merge'; 'sort = PRAWDA' to domyślny ... –

+3

który nie wydaje się utrzymywać pierwotnej kolejności' samp' z jakiegoś powodu ... – KennyPeanuts

+12

Cóż, bzdura, przepraszam. 'sort = FALSE' zwraca wiersze w" nieokreślonej kolejności ". Wygląda na to, że potrzebuję RTFM. ;-) Przywołajcie "świetny komentarz". Lubię dobrze wykonaną wronę. –

Odpowiedz

2

Można to zrobić z match i podzbiorów key przez wynik:

bottles <- key[match(samp, key$num),] 
# rownames are odd because they must be unique, clean them up 
rownames(bottles) <- seq(NROW(bottles)) 
+0

Joshua, czy nie powinno to być 'match (key $ num, samp)' zamiast? Ponieważ zgodnie z '? Dopasowaniem' długość wyniku jest długością pierwszego argumentu. Lepiej jest użyć składni '% w%', aby zapobiec takim pomyłkom: 'klawisz [klucz $ num% w% samp,]'. Zauważ, że możesz łatwo zresetować nazwy wierszy, po prostu przypisując wartość NULL, bez potrzeby tworzenia jawnej sekwencji. – TMS

+0

@ Tom: OP potrzebował wyniku długości 'samp'. 'match (key $ num, samp)' tworzy kilka 'NA' i' key [key $ num% w% samp, '' brakuje jednego rzędu i jest w złej kolejności. Zgadzam się z twoim komentarzem 'rownames <-'. –

+0

Joshua, muszę przyznać, że nie miałem dość energii, aby zrozumieć konkretną sytuację PO. Co mnie myli to to, że 'match (samp, key $ num)' jest wektorem woluminu TRUE/FALSE o długości 'samp' zamiast długości' key', co jest trochę dziwne, kiedy używasz go do podsekcji 'key ' 'lub co najmniej nietypowe. Jeśli to działa, to tylko w tej konkretnej sytuacji ... – TMS

2

join w pakiecie plyr doskonale nadaje się do tego ...

samp <- c(9, 1, 4, 1) 
num <- 1:10 
vol <- sample(50:100, 10) 
key <- data.frame(num, vol) 
samp<-as.data.frame(samp) 
names(samp)<-"num" 
library("plyr") 
join(key,samp,type="right") 
Powiązane problemy