Apakah ada cara yang lebih mudah untuk memastikan bahwa baris bingkai data dipesan sesuai dengan vektor "target" seperti yang saya terapkan dalam contoh singkat di bawah ini?
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")
Ini sepertinya agak terlalu "rumit" untuk menyelesaikan pekerjaan:
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
. Saya sudah mencobamatch
tetapi tidak berhasil.match()
. Apa yang terlintas dalam pikiran adalahduplicated()
,unique()
atau kebiasaan rutin lainnya yang "menjaga" elemen yang diinginkan sambil membuang yang lain. 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)))),]
Saya lebih suka menggunakan
***_join
didplyr
setiap kali saya harus mencocokkan data. Satu kemungkinan mencoba untuk iniPerhatikan bahwa input untuk
***_join
memerlukan tbls atau data.framesumber
dplyr
benar-benar bagus. Akhirnya banyak menggunakan ini sekarang jugatarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Metode ini sedikit berbeda, itu memberi saya fleksibilitas lebih dari jawaban sebelumnya. Dengan membuatnya menjadi faktor yang diurutkan, Anda dapat menggunakannya dengan baik
arrange
dan semacamnya. Saya menggunakan reorder.factor darigdata
paket.Selanjutnya, gunakan fakta bahwa sekarang sudah dipesan:
Jika Anda ingin kembali ke pemesanan (alfabet) asli, cukup gunakan
as.character()
untuk mengembalikannya ke keadaan semula.sumber
setDT(df)[ , name := factor(name, levels = target)]
. Kemudian lihat duadata.table
jawaban di siniKami dapat menyesuaikan level faktor berdasarkan
target
dan menggunakannya dalamarrange
Atau
order
dan menggunakannyaslice
sumber
Jika Anda tidak ingin menggunakan perpustakaan dan Anda memiliki terulangnya dalam data Anda, Anda dapat menggunakan
which
dengansapply
juga.sumber