3

私はRが初めてで、構文に苦労しています。次のデータ フレーム データがあるとします。

value   label    second
1       a        q
2       a        q
3       a        ASDF
4       b        q
6       b        QWERTY
6       b        QWERTY
7       c        q
8       c        q
9       c        q
10      d        q

ここで、 の指定された値のdf$secondの最大値に対応するのベクトルを取得したいと考えています。たとえば、 が与えられた場合、を返したいとします。のために、私は戻りたいです。df$valuedf$labeldf$label = 'a''ASDF'df$label = 'b''QWERTY', 'QWERTY'

これが私が試していることです:

max_value <- max(data$value[data$label == 'a'])
    result <- c()
    for (x in data$value){
        if (x == max_value){
            result <- c(result, data$second)
        }
    }

現在、これは適切な結果ベクトルを生成しません。sapply、tapply、mapply などを使用してこれを行う方法を見つけたいと思います。これらの機能について頭を悩ませているだけです。どんな助けでも大歓迎です。

4

3 に答える 3

3

data.tableで簡単に:

library(data.table)
DT <- data.table(df, key="label")
DT[.(lab)][value==max(value), second]

# where `lab` is whatever label value you are trying to find

のすべての値に対してこれを行いたい場合は、引数labelを使用するだけであることに注意してください。by

DT[, c(.SD, mx=max(value)), by=label][value==mx, second, by=label]

   label second
1:     a   ASDF
2:     b QWERTY
3:     b QWERTY
4:     c      q
5:     d      q
于 2013-10-08T21:39:15.177 に答える
2
lapply( split(dat, dat$label),
       function(df) df[df$value == max(df$value), "second"] )
$a
[1] ASDF
Levels: ASDF q QWERTY

$b
[1] QWERTY QWERTY
Levels: ASDF q QWERTY

$c
[1] q
Levels: ASDF q QWERTY

$d
[1] q
Levels: ASDF q QWERTY

ファクターバゲージを取り除きたい場合:

 lapply( split(dat, dat$label), 
    function(df) as.character(df[df$value == max(df$value), "second"]) )
$a
[1] "ASDF"

$b
[1] "QWERTY" "QWERTY"

$c
[1] "q"

$d
[1] "q"

特定の葉を抽出するには、その結果を値に設定し、「[[」で抽出します。

val <- lapply( split(dat, dat$label), 
    function(df) as.character(df[df$value == max(df$value), "second"]) )
val[["a"]]
#[1] "ASDF"
于 2013-10-08T21:40:46.033 に答える