计算并附加数据框中选定列的列总计

NM_*_*NM_ 5 r dplyr tidyverse janitor

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

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") 
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

> 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
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

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

Sam*_*rke 6

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

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

l以下是对、n和列求和的方法offspring

mytable %>%
  mutate(lm = l * m) %>%
  mutate(n = n0) %>%
  mutate(offspring = lm * n) %>%
  adorn_totals("row",,,,l, n, offspring) 
Run Code Online (Sandbox Code Playgroud)

返回:

    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
Run Code Online (Sandbox Code Playgroud)

伴随着警告:

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


akr*_*run 2

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

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

-输出

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