2013-03-22 13 views
7

私はデータフレームを持っており、係数の各レベルに対して連続変数var1の分位数を持つデータフレームに新しい変数を作成しようとしています。strataファクタレベル別の数量R

# 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つの方法を使用してみましたが、いずれも使用可能な結果が得られませんでした。まず、私はstrataの各レベルにqfunを適用するaggregateを使用してみました:

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

これは因子レベルによって分位数を返すが、出力バックデータ・フレーム(例えば、中に強制することは困難であり、unlistを使用して行ありません新しい変数値はデータフレームの正しい行で上書きされます)。

第二のアプローチは、ステップでこれを行うことであった

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のビンの外側にあります。私は何かシンプルなことを逃しているように感じる。どんな提案も大歓迎です。

答えて

8

私はあなたの問題は、あなたが本当に

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] 

集計は通常、元のように小さいオブジェクトを返す意味集約したいが、ave、(またはdata.tableまたはplyr)を使用していないということだと思います。 (あなたはxは、各階層のためlist 1の要素だったdata.frameを取得した場合inthis

+0

(1) - !私はいつも '忘れますave'。 – ndoogan

+0

@mnelのおかげでそんなに3種類の方法のために、私は、単純な何かが欠けされている必要があります知っていた

dat$q <- ave(dat$var1,dat$strata,FUN=qfun) 
Chris

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 
} 

そして、私のほか...

関連する問題