我如何在R中使用lapply将名字作为绘图标题与数据一起循环?

时间:2019-06-05 22:05:47

标签: r loops ggplot2 lapply

我有这个功能可以满足我的需要-它可以从原始数据中创建一个干净的表,使其成为ggplot,然后使用lapply在所有我想要的变量中运行它原始表格data

#Get colnames of all numeric varaibles
nlist <- names(data[,sapply(data,is.numeric)])

#Create function
varviz_n <- function(dat, var){
  var <- dat[,which(names(dat) == var)]

  title<-var

  tab <- dat %>%
    group_by(group = cut(var, breaks = seq(0, max(var), 10)),
             groupedsupport) %>%
    summarise(n = n()) %>%
    mutate(freq = n / sum(n)) %>%
    filter(!is.na(group),n>10)

  tab2 <- tab %>%
    group_by(groupedsupport) %>%
    summarise(mean = mean(freq),
              median = median(freq))

  finaltab <- tab %>% left_join(tab2, by = "groupedsupport")

  fplot <- finaltab %>%
    ggplot(aes(fill=group,x=groupedsupport,y=freq)) +
    geom_col(position="dodge") +
    geom_text(aes(label = paste("n =",n), n = (n + 0.05)), position = position_dodge(0.9), vjust = 0, size=2) +
    geom_errorbar(aes(groupedsupport, ymax = median, ymin = mean),
                  size=0.5, linetype = "longdash", inherit.aes = F, width = 1) +
    scale_y_continuous(labels = scales::percent) +
    xlab("") + ylab("") +
    ggtitle(title) + 
    scale_fill_discrete("")

filename = filename <- paste0(finaltab$var)
ggsave(paste("Plots/",filename,".png"), width = 10, height = 7)

  return(fplot)
}

#Run function
lapply(nlist, varviz_n, dat = data)

这几乎完全符合我的要求-问题是它正在运行的所有变量都是0-100数字,并且正在创建绘图,但我完全不知道如何获取列名作为图或键的标题。所以我不知道哪个图形被返回。

有人可以帮助我找出一种方法来从nlist中获取列名作为我的地块标题吗?现在,它的打印方式将显示列的第一个值,而不是实际的列名:

Exactly the graph I want with no title

由于标题/变量未正确填充,因此将其保存在“图”文件夹中的最后一段代码也不起作用。

您可以使用类似的方法来创建data来测试代码:data <- data.frame(v1 = sample(1:100,1000,replace=T),v2 = sample(1:100,1000,replace=T),v3 = sample(1:100,1000,replace=T),groupedsupport = sample(LETTERS[1:3],1000,replace = TRUE))

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您只需要交换以下步骤:

var <- dat[,which(names(dat) == var)]
title <- var

应该是

title <- var
var <- dat[,which(names(dat) == var)]

var被分配给选定数据的列,因此当在title中再次调用它时,它正在查找该向量而不是列名。

如果这不能解决问题,请给我们一些代码来模仿data的内容。