1

世帯ID(「id」)と世帯が所有する車両の燃費(「mpg」)を含むデータセットがあります。これは長い形式で、「id」と「mpg」の 2 つの列のみです。

aggregate() 関数または ddply() のいずれかを使用して、次の関数をデータに適用しようとしています:

logratio <- function(data=x, mpg=mpg)
{
    if (length(data[mpg])>1) {
        ratio <- log(max(data[mpg])/min(data[mpg]))
        return(ratio)
    }
    else return(0)
}

私は次のことを試しました:

mpgdf <- aggregate(mpg~id, FUN=logratio, data=mpgdata)

df <- ddply(mpgdata,~id,logratio)

どちらも機能しません。

ここで重要なのは、私の理論上のワイド フォーマットは、id ごとに 1 つの行を持つ 'id' 列であり、次に各車両の mpg の列が車両の最大数まで (つまり、車両が最も多い家に 3 台ある場合) になるということです。車両、'mpg1、'mpg2'、'mpg3')。そして、最高の燃費と最小の燃費の比率の自然対数を見つけたいと思います。車両が 1 台しかない場合は 0 (対数 1) を返します。

plyr と reshape の両方が既存の「mpg」列の値として列を設定したいように見えるので、私は少しイライラし始めていますが、上記で説明したようにそれらを望んでいます。

これを 2 つの列を持つデータフレームとして返すことを希望します。「id」と各世帯 ID を「mpglogratio」に対して一度に設定して、それをより大きなデータセットにマージできるようにします。

そして、助けていただければ幸いです!

ありがとう。

4

1 に答える 1

1

あなたとこれplyrを試すことができます

logratio <- function(x)
        log(max(x)/min(x))

require(plyr)
mtcars <- mtcars[,c("cyl", "mpg")]
mtcars <- rbind(mtcars, c(5, 30))

ddply(mtcars, .(cyl), summarise, mpglogratio = logratio(mpg))
##   cyl mpglogratio
## 1   4     0.46002
## 2   5     0.00000
## 3   6     0.18419
## 4   8     0.61310

実際のデータと置き換えcylて、実際のデータで機能させるだけで、実際には長さをテストする必要はありません.mpgの長さが1の場合、最終的にはidmtcarsmax == minmax/min == 1log(1)0

最後のメモ、すぐにマージしたい場合は、transform代わりにsummariseこのように使用してください

ddply(mtcars, .(cyl), transform, mpglogratio = logratio(mpg))
于 2013-07-23T17:42:34.810 に答える