Gibt es eine einfachere Möglichkeit, um sicherzustellen, dass die Zeilen eines Datenrahmens nach einem "Ziel" -Vektor geordnet sind, wie ich ihn im folgenden kurzen Beispiel implementiert habe?
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")
Das scheint irgendwie etwas zu "kompliziert" zu sein, um die Arbeit zu erledigen:
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
. Ich habe es versucht,match
aber es funktioniert nicht gut.match()
. Was mir in den Sinn kommtduplicated()
, istunique()
eine andere benutzerdefinierte Routine, die die gewünschten Elemente "beibehält", während die anderen weggeworfen werden. 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)))),]
Ich ziehe es vor Gebrauch
***_join
indplyr
wann immer ich brauche Daten übereinstimmen. Ein möglicher Versuch dafürBeachten Sie, dass für die Eingabe für
***_join
tbls oder data.frame erforderlich istquelle
dplyr
sind wirklich nett. Verwenden Sie diese mittlerweile auch häufigtarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Diese Methode ist etwas anders, sie hat mir etwas mehr Flexibilität als die vorherige Antwort gegeben. Indem Sie es zu einem geordneten Faktor machen, können Sie es gut in
arrange
und so verwenden. Ich habe reorder.factor aus demgdata
Paket verwendet.Verwenden Sie als Nächstes die Tatsache, dass es jetzt bestellt ist:
Wenn Sie zur ursprünglichen (alphabetischen) Reihenfolge zurückkehren möchten, verwenden Sie einfach, um
as.character()
den ursprünglichen Zustand wiederherzustellen.quelle
setDT(df)[ , name := factor(name, levels = target)]
. Dann sehen Sie die zweidata.table
Antworten hierWir können die Faktorstufen basierend darauf anpassen
target
und in verwendenarrange
Oder
order
es und benutze es inslice
quelle
Wenn Sie keine Bibliotheken verwenden möchten und Ihre Daten erneut auftreten, können Sie sie auch
which
mit verwendensapply
.quelle