Czy istnieje łatwiejszy sposób na zapewnienie, że wiersze ramki danych są uporządkowane zgodnie z wektorem „docelowym”, jak ten, który zaimplementowałem w poniższym krótkim przykładzie?
df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))
df
# name value
# 1 a TRUE
# 2 b TRUE
# 3 c FALSE
# 4 d FALSE
target <- c("b", "c", "a", "d")
Wydaje się to w jakiś sposób zbyt „skomplikowane”, aby wykonać zadanie:
idx <- sapply(target, function(x) {
which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL
df
# name value
# 1 b TRUE
# 2 c FALSE
# 3 a TRUE
# 4 d FALSE
b,c,a,d,b,c,a,d
. Próbowałem,match
ale to nie działa dobrze.match()
. Co przychodzi na myśl toduplicated()
,unique()
czy jakiś inny zwyczaj rutyna, że „trzyma” żądane elementy podczas wyrzucać innych. HTHdf <- data.frame(name=letters[c(1:4, 1:4)], value=c(rep(TRUE, 2), rep(FALSE, 2),rep(TRUE, 2), rep(FALSE, 2) )) target <- c("b", "c", "a", "d") df[order(unlist(sapply(df$name, function(x) which(target == x)))),]
Wolę używać
***_join
w,dplyr
gdy potrzebuję dopasować dane. Jedna z możliwych próbZwróć uwagę, że dane wejściowe dla
***_join
require tbls lub data.frameźródło
dplyr
są naprawdę fajne. Kończy się przy użyciu te dużo już takżetarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Ta metoda jest nieco inna, zapewniła mi nieco większą elastyczność niż poprzednia odpowiedź. Robiąc z niego uporządkowany czynnik, możesz go ładnie używać w
arrange
i takich. Użyłem reorder.factor zgdata
pakietu.Następnie skorzystaj z faktu, że jest teraz zamówiony:
Jeśli chcesz wrócić do pierwotnego (alfabetycznego) uporządkowania, po prostu użyj
as.character()
go, aby przywrócić pierwotny stan.źródło
setDT(df)[ , name := factor(name, levels = target)]
. Następnie zobacz dwiedata.table
odpowiedzi tutajMożemy dostosować poziomy współczynników na podstawie
target
i wykorzystać je warrange
Lub
order
to i użyj go wslice
źródło
Jeśli nie chcesz używać żadnych bibliotek i masz powtórzenia w swoich danych, możesz również użyć
which
withsapply
.źródło