如何检索列表(数据框)中的元素名称以将其用作图表的标题?

时间:2018-01-15 06:58:30

标签: r list lattice

如此简单而且没有进一步的麻烦 - 是否可以只检索列表中的元素名称并将其用作情节的主标题?

让我解释一下 - 例如:

让我们创建一个随机的df:

a <- c(1,2,3,4)
b <- runif(4)
c <- runif(4)
d <- runif(4)
e <- runif(4)
f <- runif(4)
df <- data.frame(a,b,c,d,e,f)
head(df)
  a         b         c         d          e          f
1 1 0.9694204 0.9869154 0.5386678 0.39331278 0.15054698
2 2 0.8949330 0.9910894 0.1009689 0.03632476 0.15523628
3 3 0.4930752 0.7179144 0.6957262 0.36579883 0.32006026
4 4 0.4850141 0.5539939 0.3196953 0.14348259 0.05292068

然后我想用特定的列创建一个数据框列表(基于此),以制作一个图。换句话说,我想制作图,其中df(a)的第一列将是图上的x轴,列b,c,d,e并且将在图上的y轴上表示值。是的,那将是5个情节 - 这就是重点!

所以我的想法是写一些简单的函数,它能够根据上面创建的df列表创建一个df&#39;所以:

my_fun <- function(x){
  a <- df[1]
  b <- x
  aname <- "x_label"
  bname <- "y_label"
  df <- data.frame(a,b)
  names(df) <- c(aname,bname)
  return(df)
}

为所有(指定)列运行它:

df_s <- apply(df[,2:6], 2, function(x) my_fun(x)) 

所以我现在有:

class(df_s)
[1] "list"
str(df_s)
List of 5
 $ b:'data.frame':  4 obs. of  2 variables:
  ..$ x_label: num [1:4] 1 2 3 4
  ..$ y_label: num [1:4] 0.969 0.895 0.493 0.485
 $ c:'data.frame':  4 obs. of  2 variables:
  ..$ x_label: num [1:4] 1 2 3 4
  ..$ y_label: num [1:4] 0.987 0.991 0.718 0.554
 $ d:'data.frame':  4 obs. of  2 variables:
  ..$ x_label: num [1:4] 1 2 3 4
  ..$ y_label: num [1:4] 0.539 0.101 0.696 0.32
 $ e:'data.frame':  4 obs. of  2 variables:
  ..$ x_label: num [1:4] 1 2 3 4
  ..$ y_label: num [1:4] 0.3933 0.0363 0.3658 0.1435
 $ f:'data.frame':  4 obs. of  2 variables:
  ..$ x_label: num [1:4] 1 2 3 4
  ..$ y_label: num [1:4] 0.1505 0.1552 0.3201 0.0529

我想要的东西,但是这里的问题是我想为我的列表中的每个df创建一个图表...结果我想要5个主题分别为b,c,d,e,f的图表轴标签是同一个名字的情节不是......所以我试过了:

lapply(df_s, function(x) plot(x[2] ~ x[1], data = x, main = ???))

应该是什么而不是问号?我试过了main = names(df_s)[x]然而它没有工作......

1 个答案:

答案 0 :(得分:1)

我认为以下工作。但是,我认为最好使用ggplot2而不是plot函数(除非您将图保存在lapply内)。

lapply(1 : length(df_s), function(x) 
    plot(df_s[[x]][,2] ~ df_s[[x]][,1], 
         xlab = names(df_s[[x]])[1],
         ylab = names(df_s[[x]])[1],
         main = names(df_s[x])))

使用ggplot2

plot_lst <- lapply(seq_along(df_s), function(i) {
            ggplot(df_s[[i]], aes(x=x_label, y=y_label)) + 
            geom_point() + 
            theme(plot.title = element_text(hjust = 0.5)) +
            ggtitle(names(df_s)[i]) })