【问题标题】:Generate table based on aggregate values in R根据 R 中的聚合值生成表
【发布时间】:2013-11-13 16:28:05
【问题描述】:

我有一个以下格式的数据框,我想根据聚合值获取表格:

VALUE   Time1   Time2
   1    NN  NF
   2    FF  FF
   7    NF  FF
   4    NN  NN
   3    NN  FF
   3    NF  NF
   5    NF  NF
   6    FF  FF

我可以使用table()函数创建一个简单的表格

 table(Time1,Time2)

这给了我以下输出

     FF FN  NF  NN  Total
 FF  2  0   0   0    2
 FN  0  0   0   0    0
 NF  1  0   2   0    3

Total 3 0   2   0    5

我希望根据 VALUE 列的总和对上述数据框进行交叉制表。我可以使用 sumif 函数在 excel 中执行此操作并获得以下输出。

    FF  FN  NF  NN  Total
 FF 8   0   0   0   8
 FN 0   0   0   0   0
 NF 7   0   8   0   15
 NN 3   0   1   4   8
 Total  18  0   9   4   31

我需要帮助在 R 中执行此操作吗?

【问题讨论】:

    标签: r sum dataframe aggregate


    【解决方案1】:

    对于sum 的情况,您可以使用xtabs。在这里,我也将其包裹在 addmargins 中以获取总数:

    addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
    #      Time2
    # Time1 FF NF NN Sum
    #   FF   8  0  0   8
    #   NF   7  8  0  15
    #   NN   3  1  4   8
    #   Sum 18  9  4  31
    

    更一般地说,您可能想查看“reshape2”中的dcast

    library(reshape2)
    dcast(mydf, Time1 ~ Time2, value.var="VALUE", fun.aggregate=sum, margins=TRUE)
    #   Time1 FF NF NN (all)
    # 1    FF  8  0  0     8
    # 2    NF  7  8  0    15
    # 3    NN  3  1  4     8
    # 4 (all) 18  9  4    31
    

    为了解决@SimonO101 的问题,如果数据被正确分解,则默认情况下所有级别都将使用xtabs 方法显示。但是,您需要将drop = FALSE 指定为dcast 版本。

    获取上述数据(因为它不包含“FN”的“Time1”或“Time2”),让我们factor 这两列,看看它如何改变输出:

    mydf[-1] <- lapply(mydf[-1], function(x) factor(x, c("FF", "FN", "NF", "NN")))
    addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
    #      Time2
    # Time1 FF FN NF NN Sum
    #   FF   8  0  0  0   8
    #   FN   0  0  0  0   0
    #   NF   7  0  8  0  15
    #   NN   3  0  1  4   8
    #   Sum 18  0  9  4  31
    

    如前所述,dcast 等效项是:

    dcast(mydf, Time1 ~ Time2, value.var="VALUE", 
          fun.aggregate=sum, margins=TRUE, drop=FALSE)
    

    【讨论】:

    • +1 但是,为什么未使用的FN 级别下降了。我读到默认情况下它应该存在?
    • @SimonO101,因为他们的样本数据不可重现。如果“Time1”和“Time2”被正确分解,它就会存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2015-06-28
    • 2018-10-20
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多