2011-08-19 10 views
5

Rのforループを使用して複数のファイルからデータをコンパイルしようとしています。すべてのデータを1つのテーブルに入れたいと思います。以下の計算は一例にすぎません。Rループ:テーブルにカラムを追加していない場合

library(reshape) 

dat1 <- data.frame("Specimen" = paste("sp", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2), "Density_3" = rnorm(10,4,2)) 
dat2 <- data.frame("Specimen" = paste("fg", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2)) 

dat <- c("dat1", "dat2") 
for(i in 1:length(dat)){ 
data <- get(dat[i]) 
melt.data <- melt(data, id = 1) 
assign(paste(dat[i], "tbl", sep=""), cast(melt.data, ~ variable, mean)) 
} 

rbind(dat1tbl, dat2tbl) 

dat2に余分な列を追加する最もスムーズな方法は何ですか?私は同じ列名(この場合は "Density_3")を取得し、それがまだ存在しない場合はゼロで埋めたいと思います。

5と6の間を変化させ、私は列(Density_1、2、3など)の数で約100個のテーブルを持っていると仮定私は、次の試してみましたが、それはうまくいきませんでした:

if(names(data) %in% "Density_3" == FALSE){ 
dat.all$Density_3 <- 0 
} else { 
dat.all$Density_3 <- dat.all$Density3} 

もう1:テーブルをrbind()するにはスムーズな方法がありますか? rbind(get(dat))が動作しないようです。

答えて

3

この質問をしばらくの間、私はその意図が不必要なgetassignの操作によって不明瞭になっている可能性があると考えています。そして私は、私はを除いて、reshape2/plyrバスに乗っていないため(aggregate(..., FUN=mean)を使用し、私はいない文字ベクトルとしてではなく2つのデータフレームのリストとして、「DAT」を構築していた答えがpylr::rbind.fill

だと思いますmeltおよびrbind.fill)が表示され、次に結果リストにdo.call(rbind.fill, ...)が表示されます。いずれにせよ、これは私があなたが望むと思うものです。本当に欠けている値が何であるかをゼロで追加するのは良い考えではないと思います。

> rbind.fill(dat1tbl, dat2tbl) 
    value Density_1 Density_2 Density_3 
1 (all) 5.006709 4.088988 2.958971 
2 (all) 4.178586 3.812362  NA 
+0

rbind.fill()コマンドについては知りませんでした。それは私が探しているものです。ありがとう! – Largh

関連する問題