5

Rのforループを使用して複数のファイルからデータをコンパイルしようとしています。すべてのデータを1つのテーブルにまとめたいと思います。以下の計算は単なる例です。

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」)を取得し、まだ存在しない場合はゼロで埋めたいと思います。列数(Density_1、2、3など)が5から6の間で変化する最大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))が動作しないようです。

4

1 に答える 1

3

この質問をしばらく見つめた後、その意図は不必要な操作によって曖昧にされたのではないかと思いgetますassign。そして答えはpylr::rbind.fill

「dat」を文字ベクトルとしてではなく、2つのデータフレームのリストとして作成しaggregate( ..., FUN=mean)(reshape2 / plyrバスを使用していないためmeltrbind.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
于 2011-08-19T14:06:44.263 に答える