Именованный числовой вектор (в порядке возрастания) в именованный логический вектор на основе условия
У меня есть названный числовой вектор vec
, затем он был отсортирован в порядке возрастания и сохранен в объекте vec_sort
, как показано ниже.
vec <- c(1,1,1,2,3,1,5)
names(vec) <- letters[1:7]
vec
# a b c d e f g
# 1 1 1 2 3 1 5
str(vec)
# Named num [1:7] 1 1 1 2 3 1 5
# - attr(*, "names")= chr [1:7] "a" "b" "c" "d" ...
Сортировка по возрастанию (именованный числовой вектор)
vec_sort <- sort(vec)
vec_sort
# a b c f d e g
# 1 1 1 1 2 3 5
str(vec_sort)
# Named num [1:7] 1 1 1 1 2 3 5
# - attr(*, "names")= chr [1:7] "a" "b" "c" "f" ...
ТРЕБУЕТСЯ ВЫХОД
Именованный логический вектор, где в первых 3 элементах числового вектора в порядке возрастания будет TRUE
, остальное FALSE
, Даже если 4-й элемент такой же, как первые 3 элемента. т.е. самое низкое значение. Используя реляционные операторы или присваивая их, можно.
vec_sort
# a b c f d e g
# 1 1 1 1 2 3 5
К
vec_sort
# a b c f d e g
# TRUE TRUE TRUE FALSE FALSE FALSE FALSE
Попытки кодов
первый
vec_sort[1:3] <- TRUE
vec_sort[4:length] <- FALSE
vec_sort
# a b c f d e g
# 1 1 1 0 0 0 0
Не логично
str(vec_sort)
# Named num [1:7] 1 1 1 0 0 0 0
- attr(*, "names")= chr [1:7] "a" "b" "c" "f" ...
второй
vec_sort <= min(vec_sort)
# a b c f d e g
# TRUE TRUE TRUE TRUE FALSE FALSE FALSE
Здесь 4-я переменная f
также подходит, чтобы быть TRUE
так как условие установлено так. это минимум, но из минимума, я хочу установить только топ 3 TRUE
Попытка выполнить еще много логических условий, но все это приводит к первым 4 как TRUE
и если я попытаюсь присвоить его TRUE
или же FALSE
это оказывается Именованный Числовой Вектор, который, как мы надеемся, показывает 1 как ИСТИНА и 0 как ЛОЖЬ, но не в конечном итоге Именованный Логический Вектор.
1 ответ
setNames(as.logical(replace(replace(vec_sort, TRUE, FALSE), 1:3, TRUE)), names(vec_sort))
#OR
setNames(as.logical(replace(vec_sort * 0, 1:3, 1)), names(vec_sort))
#OR
setNames(c(rep(TRUE, 3), rep(FALSE, length(vec_sort)-3)), names(vec_sort))
#OR
replace(vec_sort == max(vec_sort) + 999, 1:3, TRUE)
# a b c f d e g
#TRUE TRUE TRUE FALSE FALSE FALSE FALSE