0

在发布这个问题之前,我已经在几个问题中搜索了类似的东西,但我找不到我要找的东西。如果这篇文章是重复的,那么我很抱歉,如果您能将我转发到正确的问题,我将不胜感激。

我有以下数据:

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")

所以,由于 which.max 的行为只允许(至少在我看来)只获得第一个元素,我想出了一个非常复杂的解决方案。查找每行的重复元素,然后,如果这些索引中的任何一个与 which.max 代码中的索引匹配,则将其更改为“double”。或多或少是这样的:

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

再次感谢任何提示!

4

1 回答 1

3

也许您可以通过直接使用whicharr.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"
于 2014-01-24T10:06:26.470 回答