当 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
我使用下面示例代码的一个版本将 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