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) ]))

控制台上的输出如下所示:

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 级和 BGANr BGA196_01 的 PeakTemp

4

2 回答 2

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 回答
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),您可以尝试使用mapply. 你可以摆弄ttl你想要的格式,比如用空格替换点。

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 回答