是否可以通过apply-family函数将标题附加到一系列直方图中,从列表中选择标题?
下面的代码创建了三个直方图。我想按顺序从列表(名为“list”)给每个名称不同的名称。我该怎么做?
data <- read.csv("outcome-of-care-measures.csv")
outcome <-data[,c(11,17,23)]
out <- apply(outcome, 2,as.data.frame)
par(mfrow=c(3,1))
apply(outcome,2, hist, xlim=range(out,na.rm=TRUE), xlab="30 day death rate")
答案 0 :(得分:2)
我会使用facet_wrap
中的ggplot2
来完成此操作。 ggplot2
非常轻松地支持这种情节:
library(ggplot2)
theme_set(theme_bw())
df = data.frame(values = rnorm(3000), ID = rep(LETTERS[1:3], each = 1000))
ggplot(df, aes(x = values)) + geom_histogram() + facet_wrap(~ ID)
要更改每个构面上方框中的文字,只需替换ID
变量中的文字:
id_to_text_translator = c(A = 'Facet text for A',
B = 'Facet text for B',
C = 'Facet text for C')
df$ID = id_to_text_translator[df$ID]
我建议仔细看看这两行中会发生什么。使用矢量化子集来执行这种替换具有紧凑的语法和高性能。替换此代码需要for
或apply
循环与一组if
语句相结合,这将使代码更长更慢。
另一种选择是直接影响levels
的{{1}},ID
:
factor
速度要快得多,尤其是在行数很多的数据集上。此外,它使levels(df$ID) = id_to_text_translator[levels(df$ID)]
保持ID
,而之前的解决方案使factor
成为ID
向量。
结果图:
character
答案 1 :(得分:1)
由于不仅是列而是另一个更改的参数,您可以使用mapply
来获取apply
系列中的函数。
args <- list(xlim=range(data, na.rm=TRUE), xlab="30 day death rate")
titles <- list("Title 1", "Title 2", "Title 3")
par(mfrow=c(3,1))
mapply(hist, data, main=titles, MoreArgs=args)
如果将invisible
函数包裹在最后一行,则可以避免控制台输出。
注意:我认为在这里使用循环要简单得多。