2013-02-09 18 views
5

の行に変換するこれらの値がダミー値であるデータフレームがあり、それらに対してlm回帰を行いたいとします。私は〜xとyと退行したいグループ化された連続変数をR

df <- data.frame("y" = c(10, 11, 12, 13, 14), 
       "x" = as.factor(c("100-102", "103-105", "106-108", "109-111", "112-114"))) 

以下のように変数の一つは、グループ化された連続変数である、一つの方法は、それらの平均数値でXファクターを交換することです。これは簡単に正規表現を使用して行われます。

もう一つの方法は、追加の行を作成して、それがこの

data.frame("y" = c(10, 10, 10, 11, 11, 11......), 
      "x" = c(100, 101, 102, 103, 104, 105......)) 

のように見えるので、これを実行する関数があり、あなたのデータセットを展開するのですか?

x1、x2、x3などの追加変数を最初に作成してから、reshape2パッケージを使用してx列を行に変換することを考えています。

答えて

4

data.table溶液。これは大型のdata.frameでも実に速いはずです。

require(data.table) 
dt <- data.table(df, key="y") 
dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))),by=y] 

あなたはより多くの列を持っていると、列xによって分割が、これは使用するコードにあるときに、各組み合わせをしたくない場合は、次の

require(data.table) 
dt <- data.table(df) 
# get all column names except "x" 
key.cols <- setdiff(names(df), "x") 
# set the data.table columns to key.cols 
setkeyv(dt, key.cols) 
dt.out <- dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))), by = key.cols] 

これは、あなたが期待する何を与える必要があります。

+0

これはエレガントでシンプルなソリューションです。ありがとう。 btw複数の列を持つデータセットではどのように拡大縮小されますか。私の例はダミーのデータフレームでした。私の実際のデータフレームには多くの数値列と1つの要素列があります。 – MySchizoBuddy

+0

分割する列は1つだけですが、データセットには複数の列があるため、他の列の行も同様に繰り返す必要があります。 – MySchizoBuddy

+1

は、ありがとう – MySchizoBuddy

2
require(stringr) 
require(foreach) 

foreach(i=1:nrow(df), .combine=rbind) %do% { 
    s <- as.numeric(str_extract_all(df$x[i], "[0-9]+")[[1]]) 
    data.frame(y=rep(df$y[i], s[2]-s[1]+1), x=seq(s[1], s[2])) 
} 

data.frameはあなたが%dopar%と一緒に行くことができ、本当に大きい場合。

+0

すばらしかったです。 2500行だけではありません。 – MySchizoBuddy

+0

'%do%'と '%dopar%'は 'foreach'パッケージによって提供されています。 – redmode

関連する問題