【问题标题】:Barplot sum of observations in two groups in RR中两组观察值的条形图总和
【发布时间】:2015-04-07 13:18:45
【问题描述】:

我有以下形式的数据:

mydata <- data.frame(test = 1:20, group = sample(c("A", "B"), 20, rep=TRUE), var1 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var2 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var3 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var4 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var5 = sample(c("yes", "no", "NA"), 20, rep=TRUE))

我想制作一个条形图,其中比较 A 组和 B 组的观察次数(频率计数),其中有 0 个“是”条目、1 个“是”条目、2 个“是”条目最多所有 5 个变量都是“是”。最终结果将是一个条形图,其中 X 轴显示所有可能的“是”条目数(0、1、2、3、4、5),Y 轴显示计数频率和组 A 的单独条形和B 对于每个 X 值。每个组的频率计数(条形高度)是具有给定数量的“是”条目的行数。缺失数据 (NA) 计为“否”。看了其他帖子,还是不太清楚怎么写,感激不尽。

【问题讨论】:

    标签: r bar-chart


    【解决方案1】:

    试试

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    f1 <- function(x) sum(x=='yes')
    
    mydata %>% 
          group_by(group) %>% 
          summarise_each(funs(f1), var1:var5) %>% 
          gather(Var, Val, var1:var5)%>%
          ggplot(., aes(x=Var, y=Val, fill=group))+
          geom_bar(stat="identity", position='dodge')
    

    更新

    根据@Math 帖子中的 cmets,也许这会有所帮助

     df1 <-  gather(mydata, Var, Val, var1:var5) %>%
                       group_by(group, test) %>%
                       summarise(Val=sum(Val=='yes')) %>% 
                       group_by(group, Val) %>% 
                       summarise(n=n())
    
     left_join(expand.grid(group=unique(df1$group),
            Val= unique(df1$Val)), df1) %>% 
                mutate(n=replace(n, is.na(n), 0))%>%
                ggplot(., aes(x=Val, y=n, fill=group))+
                 geom_bar(stat='identity', position='dodge')
    

    【讨论】:

    • 奇怪,安装了所有包但得到以下信息:“错误:找不到函数“%>%”
    • @marcel 你打电话给library(dplyr)
    • 看起来我的 dplyr 有问题:警告消息:包“dplyr”是在 R 版本 3.1.2 下构建的错误:“dplyr”的包或命名空间加载失败我正在使用 R 3.1。 0。有什么方法可以用基本函数做到这一点?
    • @marcel 你可以升级到 R 3.1.2
    • 得到它的工作,这给出了正确的解决方案,谢谢。有什么方法可以格式化绘图,以便一组中的 0 频率不会导致第二组的双宽条?谢谢,
    【解决方案2】:

    barplot 函数接受一个矩阵作为参数,并将根据列对条形图进行分组。

    您可以在列上使用apply 生成所需的矩阵(第二个参数==2),然后使用barplot 进行绘图:

    res=apply(as.matrix(mydata[,3:ncol(mydata)]), 2, function(cc) { return(c(sum(mydata$group=="A" & cc=="yes"), sum(mydata$group=="B" & cc=="yes"))) })
    barplot(res, beside=T)
    

    编辑 按行申请,思路是一样的,就是要为barplot生成一个矩阵。

    mydata$count = apply(as.matrix(mydata[3:ncol(mydata)]), 1, 
    function(cc) { return(sum(cc=="yes")) })
    barmat = c()
    for (ii in 1:range(mydata$count)[2]) {
        barmat = cbind(barmat, c(sum(mydata$group=="A" & mydata$count==ii),sum(mydata$group=="B" & mydata$count==ii) ))
    }
    colnames(barmat) = 1:range(mydata$count)[2]
    barplot(barmat, beside=T)
    

    【讨论】:

    • 我明白了,我解释得不够好。实际上我希望逐行查看并询问每行中有多少“是”条目。然后绘制以下内容;对于 A 组,三个观察值(行)有 0 个“是”条目,两行有 1 个“是”,等等。在 B 组中,2 行有 0 个“是”条目,三行只有 1 个“是”,等等..,一直到所有 5 var 的最大值都是 "yes" 。 x 轴标签将是“0”、“1”、“2”、“3”、“4”、“5”
    • 谢谢,这个解决方案也完全正确,使用基函数。
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多