Получение вхождения значений в соответствии с условием

Перед публикацией этого вопроса я искал что-то похожее в нескольких вопросах, но не смог найти то, что искал. Если этот пост дублируется, я прошу прощения, и я буду признателен, если вы можете переслать мне правильный вопрос.

У меня есть следующие данные:

data<-data.frame(a=c(0:10),b=c(5:15),c=c(10:20),d=c(1:5,15:20))

и я "просто" ищу, чтобы получить имена столбцов строки с максимальными значениями. Я выполняю эту задачу с

names(data)[apply(data,1,which.max)]

На самом деле, поскольку есть два столбца (c & d[6:10]), которые соответствуют условию максимума, я бы хотел получить что-то вроде:

result<-c("c","c","c","c","c","double","double","double","double","double")

Итак, поскольку поведение которого.max позволяет (по крайней мере, мне кажется) получить только первый элемент, я решил, что может быть действительно сложным решением. Поиск дублированных элементов каждой строки и затем, если какой-либо из этих индексов совпадает с индексами из кода, с которым.max, измените его на "double". Более или менее что-то вроде этого:

index<-t(apply(data,1,function (x) duplicated(x,fromLast=TRUE)))
colnames(index)<-colnames(data)

Еще раз любые советы будут более чем оценены!

1 ответ

Может быть, вы можете упростить свой подход, используя напрямую which а также arr.ind параметр.

data <- data.frame(a = c(0:10), b = c(5:15), c = c(10:20), d = c(1:5, 15:20))
ind <- which(data == max(data), arr.ind = TRUE)
ind
##      row col
## [1,]  11   3
## [2,]  11   4

names(data)[ind[,2]]
## [1] "c" "d"

РЕДАКТИРОВАТЬ

Чтобы получить одинаковые результаты в строке

lapply(apply(data, 1, function(x) which(x == max(x), arr.ind = TRUE)), names)
## [[1]]
## [1] "c"

## [[2]]
## [1] "c"

## [[3]]
## [1] "c"

## [[4]]
## [1] "c"

## [[5]]
## [1] "c"

## [[6]]
## [1] "c" "d"

## [[7]]
## [1] "c" "d"

## [[8]]
## [1] "c" "d"

## [[9]]
## [1] "c" "d"

## [[10]]
## [1] "c" "d"

## [[11]]
## [1] "c" "d"
Другие вопросы по тегам