根据条件获得值的出现

时间:2014-01-24 09:59:51

标签: r max find-occurrences

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

我有以下数据:

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)

再一次,任何提示都会受到赞赏!

1 个答案:

答案 0 :(得分: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"