在发布这个问题之前,我已经在几个问题上搜索了类似的东西,但我无法找到我要找的东西。 如果这篇文章是重复的,我很抱歉,如果你能把我转到正确的问题,我将不胜感激。
我有以下数据:
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&amp; 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)
再一次,任何提示都会受到赞赏!
答案 0 :(得分:3)
您可以直接使用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"