Получение вхождения значений в соответствии с условием
Перед публикацией этого вопроса я искал что-то похожее в нескольких вопросах, но не смог найти то, что искал. Если этот пост дублируется, я прошу прощения, и я буду признателен, если вы можете переслать мне правильный вопрос.
У меня есть следующие данные:
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"