【发布时间】: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 <- 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]))) .