当 table 大小可变时,如何使用 dplyr 指定列索引进行变异?

How to specify column index to mutate across using dplyr when table size is variable?

我使用下面示例代码的一个版本将 table 值转换为百分比。我遇到的问题是这段代码部署在一个闪亮的应用程序中,其中 table 大小根据用户输入反应 expands/contracts (按列和行),甚至 left-most 列 header(此数据框示例中的“收件人”列 header)会根据用户输入做出反应。

如何将下面 mutate(across()) 语句中的列引用从“To”和“Sum”更改为数据框的第一列和最后一列?

此代码适用于如下所示的静态数据框,但不适用于在 Shiny 中呈现的动态数据框。

示例代码:

library(tidyverse)

data <- 
  data.frame(
    To = c("A","B","C"),
    A = c(1,2,4),
    B = c(3,4,5),
    C = c(5,6,7)
  )

data <- data %>% 
  replace(is.na(.), 0) %>%
  bind_rows(summarise_all(., ~(if(is.numeric(.)) sum(.) else "Sum")))
data <- cbind(data, Sum = rowSums(data[,-1]))

data %>%
  mutate(across(-c(To), ~ ./.[To == "Sum"]))

要排除第一列,您只需使用 -1。由于 Sum 包含在最后一行中,您可以除以 .x[length(.x)]:

library(tidyverse)

data %>%
  mutate(across(-1, ~ .x / .x[length(.x)]))
#>    To         A         B         C       Sum
#> 1   A 0.1428571 0.2500000 0.2777778 0.2432432
#> 2   B 0.2857143 0.3333333 0.3333333 0.3243243
#> 3   C 0.5714286 0.4166667 0.3888889 0.4324324
#> 4 Sum 1.0000000 1.0000000 1.0000000 1.0000000