Есть ли более простой способ убедиться, что строки фрейма данных упорядочены в соответствии с «целевым» вектором, как я реализовал в коротком примере ниже?
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")
Это кажется слишком сложным, чтобы выполнить работу:
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
. Я пытался,match
но это не работает хорошо.match()
. Что приходит на умduplicated()
,unique()
или какая-то другая обычная процедура, которая «сохраняет» нужные элементы, отбрасывая другие. 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)))),]
Я предпочитаю использовать
***_join
вdplyr
случаях , когда мне нужно , чтобы соответствовать данным. Одна из возможных попыток для этогоОбратите внимание, что для ввода
***_join
требуется tbls или data.frameисточник
dplyr
действительно хороши. Вtarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Этот метод немного отличается, он предоставил мне немного больше гибкости, чем предыдущий ответ. Превратив его в упорядоченный фактор, вы можете красиво использовать его
arrange
и тому подобное. Я использовал reorder.factor изgdata
пакета.Далее используйте тот факт, что теперь он заказан:
Если вы хотите вернуться к исходному (алфавитному) порядку, просто используйте,
as.character()
чтобы вернуть его в исходное состояние.источник
setDT(df)[ , name := factor(name, levels = target)]
. Тогда посмотрите дваdata.table
ответа здесьМы можем настроить уровни факторов на основе
target
и использовать его вarrange
Или
order
это и использовать его вslice
источник
Если вы не хотите использовать какую - либо библиотеку , и вы должны reoccurrences в ваших данных, вы можете использовать
which
сsapply
а.источник