创建函数以生成列联表列表
Creating Function To Generate List of Contingency tables
我正在尝试编写一个函数,该函数将从导入的 data.frame (tibble) 中生成一个意外事件 table 的列表。我可以使用 for
循环来这样做;但是,由于文件中的行数,我宁愿使用 apply
系列。
library(dplyr)
set.seed(01142022)
df <- tibble('MLST' = sample(1000:9999, 5, replace = F),
'2018(n)' = sample(1:25, 5, replace = T),
'2019(n)' = sample(1:25, 5, replace = T))
df <- rbind(df, c('Total', colSums(df[, 2:3])))
df %<>%
mutate(across(.cols = MLST, as.factor)) %>%
mutate(across(.cols = c(`2018(n)`, `2019(n)`), as.numeric))
# Contigency Table
C1 <- matrix(
data = c(df[1,2],
df[nrow(df), 2] - df[1,2],
df[1,3],
df[nrow(df), 3] - df[1,3]),
nrow = 2,
ncol = 2,
dimnames = list(c("MLST", "Non-Typed"), c("2018", "2019")))
上面的代码提供了导入文件的外观的代表 df
,其中包含每种 MLST 类型的计数以及总计这些计数的行。 C1
是我希望每种 MLST 类型出现每种意外情况 table 的示例。
关于如何编写一个函数来为每个 MLST 类型生成一个应急列表 table 的任何建议,然后我可以在 apply
函数之一中使用?
library(dplyr)
set.seed(01142022)
df <- tibble('MLST' = sample(1000:9999, 5, replace = F),
'2018(n)' = sample(1:25, 5, replace = T),
'2019(n)' = sample(1:25, 5, replace = T))
ctab <- function(x){
matrix(
data = c(df[x,2],
sum(df[-x,2]),
df[x,3],
sum(df[-x,3])),
nrow = 2,
ncol = 2,
dimnames = list(c("MLST", "Non-Typed"), c(names(df)[2], names(df)[3])))
}
lapply(1:nrow(df), ctab)
#> [[1]]
#> 2018(n) 2019(n)
#> MLST 6 10
#> Non-Typed 33 43
#>
#> [[2]]
#> 2018(n) 2019(n)
#> MLST 14 14
#> Non-Typed 25 39
#>
#> [[3]]
#> 2018(n) 2019(n)
#> MLST 12 8
#> Non-Typed 27 45
#>
#> [[4]]
#> 2018(n) 2019(n)
#> MLST 1 13
#> Non-Typed 38 40
#>
#> [[5]]
#> 2018(n) 2019(n)
#> MLST 6 8
#> Non-Typed 33 45
Created on 2022-01-14 by the reprex package (v2.0.1)
这是另一个使用 tidyverse
的选项,您可以跳过使用函数和 return 矩阵列表。在这里,我首先删除总行,然后将每一行 split
放入其自己的数据框中。然后,使用 purrr::map
将 total
行绑定到所有数据帧。然后,我更改第一列中的名称,然后将它们设为行名。然后,我 mutate
遍历所有列并从 Non-Typed
中减去 MLST
(即总数)。然后,return作为矩阵。
library(tidyverse)
df %>%
filter(MLST != "Total") %>%
split(., row(.)[, 1]) %>%
map(
function(x)
bind_rows(x, df %>%
filter(MLST == "Total")) %>%
mutate(MLST = c("MLST", "Non-Typed")) %>%
tibble::column_to_rownames("MLST") %>%
mutate(across(everything(), ~ c(first(.), diff(.)))) %>%
as.matrix()
)
输出
$`1`
2018(n) 2019(n)
MLST 6 10
Non-Typed 33 43
$`2`
2018(n) 2019(n)
MLST 14 14
Non-Typed 25 39
$`3`
2018(n) 2019(n)
MLST 12 8
Non-Typed 27 45
$`4`
2018(n) 2019(n)
MLST 1 13
Non-Typed 38 40
$`5`
2018(n) 2019(n)
MLST 6 8
Non-Typed 33 45
我正在尝试编写一个函数,该函数将从导入的 data.frame (tibble) 中生成一个意外事件 table 的列表。我可以使用 for
循环来这样做;但是,由于文件中的行数,我宁愿使用 apply
系列。
library(dplyr)
set.seed(01142022)
df <- tibble('MLST' = sample(1000:9999, 5, replace = F),
'2018(n)' = sample(1:25, 5, replace = T),
'2019(n)' = sample(1:25, 5, replace = T))
df <- rbind(df, c('Total', colSums(df[, 2:3])))
df %<>%
mutate(across(.cols = MLST, as.factor)) %>%
mutate(across(.cols = c(`2018(n)`, `2019(n)`), as.numeric))
# Contigency Table
C1 <- matrix(
data = c(df[1,2],
df[nrow(df), 2] - df[1,2],
df[1,3],
df[nrow(df), 3] - df[1,3]),
nrow = 2,
ncol = 2,
dimnames = list(c("MLST", "Non-Typed"), c("2018", "2019")))
上面的代码提供了导入文件的外观的代表 df
,其中包含每种 MLST 类型的计数以及总计这些计数的行。 C1
是我希望每种 MLST 类型出现每种意外情况 table 的示例。
关于如何编写一个函数来为每个 MLST 类型生成一个应急列表 table 的任何建议,然后我可以在 apply
函数之一中使用?
library(dplyr)
set.seed(01142022)
df <- tibble('MLST' = sample(1000:9999, 5, replace = F),
'2018(n)' = sample(1:25, 5, replace = T),
'2019(n)' = sample(1:25, 5, replace = T))
ctab <- function(x){
matrix(
data = c(df[x,2],
sum(df[-x,2]),
df[x,3],
sum(df[-x,3])),
nrow = 2,
ncol = 2,
dimnames = list(c("MLST", "Non-Typed"), c(names(df)[2], names(df)[3])))
}
lapply(1:nrow(df), ctab)
#> [[1]]
#> 2018(n) 2019(n)
#> MLST 6 10
#> Non-Typed 33 43
#>
#> [[2]]
#> 2018(n) 2019(n)
#> MLST 14 14
#> Non-Typed 25 39
#>
#> [[3]]
#> 2018(n) 2019(n)
#> MLST 12 8
#> Non-Typed 27 45
#>
#> [[4]]
#> 2018(n) 2019(n)
#> MLST 1 13
#> Non-Typed 38 40
#>
#> [[5]]
#> 2018(n) 2019(n)
#> MLST 6 8
#> Non-Typed 33 45
Created on 2022-01-14 by the reprex package (v2.0.1)
这是另一个使用 tidyverse
的选项,您可以跳过使用函数和 return 矩阵列表。在这里,我首先删除总行,然后将每一行 split
放入其自己的数据框中。然后,使用 purrr::map
将 total
行绑定到所有数据帧。然后,我更改第一列中的名称,然后将它们设为行名。然后,我 mutate
遍历所有列并从 Non-Typed
中减去 MLST
(即总数)。然后,return作为矩阵。
library(tidyverse)
df %>%
filter(MLST != "Total") %>%
split(., row(.)[, 1]) %>%
map(
function(x)
bind_rows(x, df %>%
filter(MLST == "Total")) %>%
mutate(MLST = c("MLST", "Non-Typed")) %>%
tibble::column_to_rownames("MLST") %>%
mutate(across(everything(), ~ c(first(.), diff(.)))) %>%
as.matrix()
)
输出
$`1`
2018(n) 2019(n)
MLST 6 10
Non-Typed 33 43
$`2`
2018(n) 2019(n)
MLST 14 14
Non-Typed 25 39
$`3`
2018(n) 2019(n)
MLST 12 8
Non-Typed 27 45
$`4`
2018(n) 2019(n)
MLST 1 13
Non-Typed 38 40
$`5`
2018(n) 2019(n)
MLST 6 8
Non-Typed 33 45