r - 如何编写 Median 函数以用于 Ggplot 图,以适应 R 数据集中的不同项目

标签 r function ggplot2 median

我需要为数据集的不同变量创建相同的图表。我的数据集如下所示:

    df5 <-  structure(list(P54a = c(20, 4, 3, 5, NA, 9, 18, 18, NA, 4, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 17, 13, NA, NA, NA, NA), P79 = c(25, 
20, 12, NA, NA, 13, NA, NA, NA, 25, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 15, NA, 1, NA, NA), center = c(203, 203, 203, 203, 108, 
108, 206, 206, 206, 206, 116, 116, 116, 116, 116, 116, 116, 116, 
116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 
116, 116, 713, 713, 713, 718, 718, 718, 718)), row.names = c(NA, 
40L), class = "data.frame")

我为一个变量编写了代码,它似乎工作正常。为了避免多次复制相同的代码,我想创建一个函数,该函数允许我通过定义感兴趣的变量和中心来使用该函数。 “单个项目”P54a 和中心 206 的代码如下所示: (中心 713 将是我与中心 206(“引用中心”)进行比较的中心)

a<-df5 %>% 
    group_by(center) %>%
    summarise(P54a = median(P54a, na.rm=T)) 
  a$center=factor(a$center, levels = a$center)
  a %>%
    mutate(center = fct_reorder(center,P54a)) ->a
  
  b<-a$P54a[which(a$center==713)] #pick the value of the reference center
  a1 <- a %>% 
    group_by(center) %>% 
    mutate(my_label = ifelse(center %in% c("206","713"),
                             paste(center,P54a, sep = ":"), NA)) %>% 
    ungroup()
  
  d <- ggplot(data=a1,aes(x=center,label=center,y=P54a,
                          fill=factor(ifelse(center=="206","target",ifelse(center== "713","Reference","all"))))) +
    geom_bar(stat= "identity") +
    scale_fill_manual(name = "center", values=c("cadetblue","gold", "orange")) +
    xlab("TitelX") +
    ylab("Median") +
    ggtitle("Titelgraph") +
    #d<- d+ theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),legend.position = "none") 
    geom_hline(aes(yintercept= b), data= filter(a1, center== 713), color="black", linetype="dashed") + ylim(0, 20)+
    #geom_text_repel(aes(label = my_label),size= 3, box.padding = 0.5 , max.overlaps = Inf)
    theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),legend.position = "none") + 
    geom_label(label=a1$my_label, vjust = -0.1)
   d

失败的尝试:

 bar_plot <- function(itemNo, # would be the defined item
                         df = df5, # the full dataset 
                         target= target_center (in my example the 206)
    ){
    
      df1 <- subset(df5, select= itemNo)
      df2 <- subset(df5, select= center)# the original dataset has other variables that's why I would here select the center item.
      df6 <- cbind(df1, df2)
    
    
    a<-df6 %>% group_by(center) %>% summarise(med_x = median(itemNo, na.rm=T)) a$center=factor(a$center, levels = a$center) a %>% mutate(center = fct_reorder(center,med_x)) ->a
    
    b<-a$itemNo[which(a$center==713)] #pick the value of the reference center 
    a1 <- a %>% group_by(center) %>% mutate(my_label = ifelse(center %in% c("target","713"), paste(center,itemNo, sep = ":"), NA)) %>% ungroup()
    
    d <- ggplot(data=a1,aes(x=center,label=center,y=itemNo, fill=factor(ifelse(center=="target","target",ifelse(center== "713","Reference","all"))))) +
 geom_bar(stat= "identity") + scale_fill_manual(name = "center", values=c("cadetblue","gold", "orange")) + xlab("TitelX") + 
ylab("Median") + ggtitle("Titelgraph") +  geom_hline(aes(yintercept= b), data= filter(a1, X0== 713), color="black", linetype="dashed") + ylim(0, 20)+ 
theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),legend.position = "none") + geom_label(label=a1$my_label, vjust = -0.1) 
    return(d)

第一个问题从中位数开始,它不采用定义的变量/项目的值,而是采用项目名称并插入变量名称作为中位数。 这是我第一次编写函数..我尝试在之前的问题/答案中找到解决方案,但没有成功..例如用于中位数:

median = numeric(0)
  for( i in 1:ncol(df5)){
    median[i] = median(df5[,i], na.rm=TRUE)
  }

非常欢迎任何帮助。非常感谢

最佳答案

您收到的错误是可以理解的,因为您正在函数内调用列名称。但在我看来,还有两件事你应该记住:

  1. 当您通过函数包装代码时,请始终尝试使用全局环境中已定义的函数参数值在函数内逐行运行它。这将使您能够轻松发现错误。就像我在这里做的那样。我获取了您正在运行的代码,然后对其进行了必要的更改。

  2. 您定义函数输入参数然后在函数内使用它们的方式是错误的。看看我的代码,你就会明白其中的区别。

功能:

bar_plot <- function(itemNo, df5, center){
  
  df1 <- subset(df5, select= itemNo)
  df2 <- subset(df5, select= center)
  df6 <- cbind(df1, df2)
  
  a<-df6 %>% 
    group_by(center) %>%
    summarise(itemNo = median(!! sym(itemNo), na.rm=T)) 
  a$center=factor(a$center, levels = a$center)
  a %>%
    mutate(center = fct_reorder(center,itemNo)) ->a
  
  b<-a$itemNo[which(a$center==713)] #pick the value of the reference center
  a1 <- a %>% 
    group_by(center) %>% 
    mutate(my_label = ifelse(center %in% c("206","713"),
                             paste(center,itemNo, sep = ":"), NA)) %>% 
    ungroup()
  
  d <- ggplot(data=a1,aes(x=center,label=center,y=itemNo,
                          fill=factor(ifelse(center=="206","target",ifelse(center== "713","Reference","all"))))) +
    geom_bar(stat= "identity") +
    scale_fill_manual(name = "center", values=c("cadetblue","gold", "orange")) +
    xlab("TitelX") +
    ylab("Median") +
    ggtitle("Titelgraph") +
    #d<- d+ theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),legend.position = "none") 
    geom_hline(aes(yintercept= b), data= filter(a1, center== 713), color="black", linetype="dashed") + ylim(0, 20)+
    #geom_text_repel(aes(label = my_label),size= 3, box.padding = 0.5 , max.overlaps = Inf)
    theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),legend.position = "none") + 
    geom_label(label=a1$my_label, vjust = -0.1)
  d
  
}

现在调用它并查看输出:

bar_plot('P54a', df5, 206)

1st output

另一个:

bar_plot('P79', df5, 206)

2nd Output

如果您有任何疑问,请告诉我。

关于r - 如何编写 Median 函数以用于 Ggplot 图,以适应 R 数据集中的不同项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69087068/

相关文章:

r - 如何计算R中的比例

c++ - Rcpp:无法加载共享对象, undefined symbol

r - 将重复测量混合模型公式从 SAS 转换为 R

C:退出函数时丢失字符串

r - 将函数应用于序列

r - 查看 ggplot2::qplot 中绘图对象的调用

r - 在 y 轴标签旁边添加自定义符号

r - 按行添加值并将它们应用于单行变量,同时保留其他变量和行

javascript - 检查一个点是否穿过一条线

r - 显示网格区域模态值的热图样式图(通过 stat_summary_2d?)