【问题标题】:Calculating and Appending Column Totals of Select Columns in a Data Frame in R在 R 中计算和附加数据框中选择列的列总计
【发布时间】:2021-10-27 20:43:18
【问题描述】:

我有以下代码用于计算某些感兴趣的数量,特别是最右边两列的总和。

library(dplyr)
library(janitor)

m = c(0, 0.8, 2.3, 4.1, 2.1)
l = c(0.3, 0.8, 0.9, 0.75, 0.25)

mytable = data.frame(l, m)
rownames(mytable) = paste("Group", 1:5)

# Initial population
n0 = c(1,1,1,1,1)

mytable = mytable %>%
  mutate(lm = l * m) %>%
  mutate(n = n0) %>%
  mutate(offspring = lm * n) %>%
  adorn_totals("row") 

这给出了以下输出:

> mytable
     l   m    lm n offspring
   0.3 0.0 0.000 1     0.000
   0.8 0.8 0.640 1     0.640
   0.9 2.3 2.070 1     2.070
  0.75 4.1 3.075 1     3.075
  0.25 2.1 0.525 1     0.525
 Total 9.3 6.310 5     6.310

我有以下问题:

  • 如何隔离特定列的列总计?就我而言,我只希望列 noffspring 的列总数。我阅读了 adorn_totals() 函数的文档,但不知道如何执行此操作。
  • 分配的行名丢失。如何使行名出现,并将“Total”一词作为列总计新行的行名?
  • 第一列没有出现总行数,这很奇怪。

【问题讨论】:

    标签: r dplyr tidyverse janitor


    【解决方案1】:

    一种选择是将除所需列之外的列转换为character 类,然后再进行更改。关于行名,tibble 不允许使用行名。我们可能需要先用rownames_to_column创建一个列

    library(dplyr)
    library(tibble)
    library(janitor)
    out <- mytable %>% 
        rownames_to_column('rn') %>%
        mutate(lm = l *m, n = n0, offspring = lm * n) %>% 
        mutate(across(-c(n, offspring), as.character)) %>% 
        adorn_totals('row', fill = NA) %>%
        type.convert(as.is = TRUE)
    

    -输出

    > out
          rn    l   m    lm n offspring
     Group 1 0.30 0.0 0.000 1     0.000
     Group 2 0.80 0.8 0.640 1     0.640
     Group 3 0.90 2.3 2.070 1     2.070
     Group 4 0.75 4.1 3.075 1     3.075
     Group 5 0.25 2.1 0.525 1     0.525
       Total   NA  NA    NA 5     6.310
    > str(out)
    Classes ‘tabyl’ and 'data.frame':   6 obs. of  6 variables:
     $ rn       : chr  "Group 1" "Group 2" "Group 3" "Group 4" ...
     $ l        : num  0.3 0.8 0.9 0.75 0.25 NA
     $ m        : num  0 0.8 2.3 4.1 2.1 NA
     $ lm       : num  0 0.64 2.07 3.075 0.525 ...
     $ n        : int  1 1 1 1 1 5
     $ offspring: num  0 0.64 2.07 3.075 0.525 ...
     - attr(*, "core")='data.frame':    5 obs. of  6 variables:
      ..$ rn       : chr [1:5] "Group 1" "Group 2" "Group 3" "Group 4" ...
      ..$ l        : chr [1:5] "0.3" "0.8" "0.9" "0.75" ...
      ..$ m        : chr [1:5] "0" "0.8" "2.3" "4.1" ...
      ..$ lm       : chr [1:5] "0" "0.64" "2.07" "3.075" ...
      ..$ n        : num [1:5] 1 1 1 1 1
      ..$ offspring: num [1:5] 0 0.64 2.07 3.075 0.525
     - attr(*, "tabyl_type")= chr "two_way"
     - attr(*, "totals")= chr "row"
    

    【讨论】:

      【解决方案2】:

      对于您的第一点和第三点:您可以通过为 adorn_totals()... 参数指定列名来控制汇总哪些列。使用... 需要为其他参数指定值,即使它们为空,因此下面的,,,, 接受这些参数的默认值。

      默认情况下会跳过第一列,因为这通常是组 ID(如您的行名),但您可以指定它应该总计。

      以下是对 lnoffspring 列进行合计的方法:

      mytable %>%
        mutate(lm = l * m) %>%
        mutate(n = n0) %>%
        mutate(offspring = lm * n) %>%
        adorn_totals("row",,,,l, n, offspring) 
      

      返回:

          l   m    lm n offspring
       0.30   0     0 1     0.000
       0.80 0.8  0.64 1     0.640
       0.90 2.3  2.07 1     2.070
       0.75 4.1 3.075 1     3.075
       0.25 2.1 0.525 1     0.525
       3.00   -     - 5     6.310
      

      连同警告:

      因为第一列被指定为总计,所以总计行中不包含标签“总计”(或用户指定的名称)

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2020-11-25
        • 2014-04-09
        相关资源
        最近更新 更多