如何在by()
调用中访问实际使用的因子组合?我想绘制来自 dbscan(fpc 包)的结果,并将相应的因子组合添加到绘图标题中。输出是类"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级的PeakTemp和BGANr BGA196_01
这与@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)
也许你正在使这比你需要的更复杂?尝试这样的事情:
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) )