【问题标题】:How can I loop colnames as plot titles along with data using lapply in R?如何在 R 中使用 lapply 将 colnames 作为绘图标题与数据一起循环?
【发布时间】:2019-06-05 22:05:47
【问题描述】:

我有这个功能接近我需要的功能——它从我的原始原始数据创建一个干净的表,使它成为一个 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 中的列名成为我的情节标题吗?现在的方式是打印列的第一个值而不是实际的列名:

将其保存在“Plots”文件夹中的最后一段代码也不起作用,因为标题/变量没有正确填充。

您可以使用类似这样的东西来创建data 来测试代码:data &lt;- 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))

谢谢!

【问题讨论】:

  • 每当您使用lapply(对一个列表进行操作)并认为您想同时对第二个列表/向量中的相应元素进行操作时,请考虑@987654333 @。在此处查看有关Map 的先前相关答案:stackoverflow.com/a/54485425/3358272
  • @r2evans 谢谢!你是说我应该使用Map 而不是 我的lapply 还是有办法将它添加到我现有的脚本中的某个地方只是为了情节标题?
  • 尝试翻转函数的前两行,以便在更改 var 的值之前分配 title
  • @Ryan,替换lapply(mydat, myfunc) 类似于Map(myfunc, mydat),但如果myfunc2 有两个参数,那么Map(myfunc2, mydat1, mydat2)lapply 中没有直接 等效项(尽管它可以粗略地近似为lapply(seq_len(mydat1), function(i) myfunc2(mydat1[i], mydat[2]))) .

标签: r loops ggplot2 lapply


【解决方案1】:

我认为你只需要交换这些步骤:

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

应该是

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

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

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

【讨论】:

  • 实际上 OP 正在覆盖 var 参数,这是一种不明智的做法。将 var 保留为字符参数,并为数据框对象使用不同的变量,或者简单地使用 title 作为函数参数:varviz_n &lt;- function(dat, title){ var &lt;- dat[,which(names(dat) == title)] ...
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多