1

by()呼び出しで実際に使用された要素の組み合わせにアクセスするにはどうすればよいですか? dbscan (fpc-package) の結果をプロットし、対応する因子の組み合わせをプロット タイトルに追加したいと考えています。出力のクラスは「by」です。attributes(res.lst)それぞれを使用するattr(res.lst,"dimnames")と、グローバル リストのみが表示されます。それを個々に使用されているデータのサブセットにマッピングすることはできません。では、by関数はどの組み合わせがどのサブセットに実際に使用されているかをどのように「知る」のでしょうか。この情報はどこに保存されますか?

目的の出力がどのように見えるかを明確にするために、簡単な例 (dbscan をスキップ) を作成しようとしました。何か助けはありますか?可能であればベースRにこだわりたいです。

dat <- data.frame(x=rnorm(1000), y=rnorm(1000), fac1=rep(c("L1", "L2"), 500), fac2= as.factor(c(rep(1, 5), rep(2, 5) )) ) # dummy data
# dummy plot function
fun.plot <- function(data, factorcomb=NA) { 
  if (is.na(factorcomb)==T) {
    ttl <- "Standard"
  } else { 
    ttl <- paste("factor combination: ", paste(factorcomb, collapse="+"))
  }
  dev.new()
  plot(data$x, data$y, main=ttl) 
}
res.lst <- by(data=dat, INDICES=dat[ ,colnames(dat[ , c(3,4)]) ], function(splt) fun.plot(splt) )

# desired result
for (f1 in levels(dat$fac1) ) {
  for (f2 in levels(dat$fac2) ) {
    fun.plot(dat[ which( dat$fac1==f1 & dat$fac2==f2), 1:2 ], factorcomb=c(f1,f2) )
   }
}

編集:これは私の元の関数からの呼び出しです。

 # by(data=adat, INDICES=adat[ ,colnames(adat[ ,c(36,41) ]) ], FUN=fun.dbscan, factornames=colnames(adat[ ,c(36,41) ]))

そして、coonsole の出力は次のようになります。

PeakTemp: 250 # Factor 1 (column number 36) + Level
BGANr: BGA196_01 #Factor 2 (column number 41) + Level
dbscan Pts=1551 MinPts=12 eps=0.015
          0  1
seed      0 17
border 1534  0
total  1534 17
etc...

実際に使用された因子の組み合わせを fun.dbscan 関数に渡したいです。その場合、レベル 250 の PeakTemp と BGANr BGA196_01 になります。

4

2 に答える 2

1

これは @joran が行ったことと似ていますが、少し異なります。

fun.plot <- function(data) {
  #change 3:4 if you have more variables
  factorcomb <- as.character(sapply(data[, 3:4], FUN = unique)) 
  ttl <- paste("factor combination: ", paste(factorcomb, collapse="+"))
  dev.new()
  plot(data$x, data$y, main=ttl) 
}
res.lst <- by(data = dat, INDICES = dat[ , 3:4], FUN = fun.plot)

編集

nmsカスタム レベル名 (例: )を渡したい場合は、 を使用してみてくださいmapplyttlドットをスペースに置き換えるなど、好きなようにフォーマットすることができます。

dat <- data.frame(x=rnorm(1000), y=rnorm(1000), fac1=rep(c("L1", "L2"), 500), fac2= as.factor(c(rep(1, 5), rep(2, 5) )) ) # dummy data
dat.split <- split(dat, dat[, 3:4])
nms <-names(dat.split)

fun.plot <- function(data, custom.names) {
  ttl <- paste("factor combination: ", custom.names)
  dev.new()
  plot(data$x, data$y, main=ttl) 
}
mapply(fun.plot, dat.split, nms)
于 2012-07-03T12:55:11.777 に答える
1

必要以上に複雑にしているのではないでしょうか? 次のようなことを試してください:

fun.plot <- function(data) { 
  ttl <- paste("factor combination: ", paste(unique(data$fac1),unique(data$fac2), sep="+"))
  dev.new()
  plot(data$x,data$y,main=ttl) 
}
res.lst <- by(data=dat, INDICES=dat[ ,colnames(dat[ ,c(3,4) ]) ], function(splt) fun.plot(splt) )
于 2012-07-02T18:16:54.090 に答える