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

実際には、最大の条件に適合する 2 つの列 (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

直接パラメータを使用すること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"
于 2014-01-24T10:06:26.470 に答える