7

var1データ フレームがあり、因子の各レベルについて、連続変数の分位点を持つデータ フレームに新しい変数を作成しようとしていますstrata

# some data
set.seed(472)
dat <- data.frame(var1 = rnorm(50, 10, 3)^2,
                  strata = factor(sample(LETTERS[1:5], size = 50, replace = TRUE))
                  )

# function to get quantiles
qfun <- function(x, q = 5) {
    quantile <- cut(x, breaks = quantile(x, probs = 0:q/q), 
        include.lowest = TRUE, labels = 1:q)
    quantile
}

2 つの方法を試してみましたが、どちらも使用可能な結果にはなりませんでした。まず、各レベルaggregateに適用するために使用してみました:qfunstrata

qdat <- with(dat, aggregate(var1, list(strata), FUN = qfun))

これは因子レベルごとに分位数を返しますが、出力をデータ フレームに強制的に戻すのは困難です (たとえば、を使用unlistすると、新しい変数値がデータ フレームの正しい行に並べられません)。

2 番目のアプローチは、これを段階的に行うことでした。

tmp1 <- with(dat, split(var1, strata))
tmp2 <- lapply(tmp1, qfun)
tmp3 <- unlist(tmp2)
dat$quintiles <- tmp3

繰り返しますが、これは各因子レベルの分位数を正しく計算しますが、明らかにaggregate、データ フレーム内で正しい順序になっていません。これは、変位値の「ビン」をデータ フレームに入れることで確認できます。

# get quantile bins
qfun2 <- function(x, q = 5) {
    quantile <- cut(x, breaks = quantile(x, probs = 0:q/q), 
        include.lowest = TRUE)
    quantile
}

tmp11 <- with(dat, split(var1, strata))
tmp22 <- lapply(tmp11, qfun2)
tmp33 <- unlist(tmp22)
dat$quintiles2 <- tmp33

の値の多くはvar1のビンの外側にありquantile2ます。シンプルなものが欠けているような気がします。どんな提案でも大歓迎です。

4

2 に答える 2

8

あなたの問題は、実際には集約したくないがave、(またはdata.tableまたはplyr)を使用することだと思います

qdat <- transform(dat, qq = ave(var1, strata, FUN = qfun))

#using plyr
library(plyr)

qdat <- ddply(dat, .(strata), mutate, qq = qfun(var1))

#using data.table (my preference)


dat[, qq := qfun(var1), by = strata]

集約は通常、元のオブジェクトよりも小さいオブジェクトを返すことを意味します。(この場合、各層に対して 1 要素のdata.frame を取得していましたxlist

于 2013-03-22T04:15:38.187 に答える
1

データ フレームで使用aveします。datシミュレートされたデータとqfun関数を使用した完全な例:

# some data
set.seed(472)
dat <- data.frame(var1 = rnorm(50, 10, 3)^2,
              strata = factor(sample(LETTERS[1:5], size = 50, replace = TRUE))
              )

# function to get quantiles
qfun <- function(x, q = 5) {
    quantile <- cut(x, breaks = quantile(x, probs = 0:q/q), 
        include.lowest = TRUE, labels = 1:q)
    quantile
}

そして私の追加...

dat$q <- ave(dat$var1,dat$strata,FUN=qfun)
于 2013-03-22T04:18:38.857 に答える