tidyverse R 中的组低计数
Group low counts in tidyverse R
我目前正在处理一个包含 714 行的 tibble 格式的数据集(每行对应一个特定于给定病毒的新序列,但如果有意义的话,多个序列来自同一病毒)。
因此,如果您查看数据,例如21 个 B19 序列。
我想在我的 tibble 中创建一个新专栏,我将所有存在几次(低于 50 计数)的病毒株归为一组(“其他”),并且所有具有高计数的病毒株都保留在每个自己的组,所以 CMV 是 CMV。因此,这将是添加到 tibble 的新列,每当出现低计数应变时,'newID' 将是其他列(见图 1)。
到现在为止,我使用了 'mutate(newID = case_when(Origin == "CMV" ~ "CMV") 然后根据计数手动对其进行分组(参见数据图),但应该有一个更容易和更少的 'hard-coding'选项对吧?
数据:
1 B19 21
2 BKPyV 8
3 CMV 161
4 Covid-19 68
5 EBV 204
6 FLU-A 22
7 HAdV-C 10
8 hCoV 84
9 HHV-1 27
10 HHV-2 3
11 HHV-6B 1
12 HIV-1 18
13 HMPV 3
14 HPV 37
15 JCPyV 4
16 NWV 12
17 unknown 9
18 VACV 9
19 VZV 13
希望对您有所帮助!
您可以使用 forcats
包 (tidyverse) 中的 fct_lump()
。
根据您的统计,我正在使用排名前 4 的病毒:
library(forcats)
data %>%
mutate(virus = as.factor(virus)) %>%
mutate(newID = fct_lump(virus, 4, w = count))
输出为:
# A tibble: 19 × 4
id virus count newID
<dbl> <fct> <dbl> <fct>
1 1 B19 21 Other
2 2 BKPyV 8 Other
3 3 CMV 161 CMV
4 4 Covid-19 68 Covid-19
5 5 EBV 204 EBV
6 6 FLU-A 22 Other
7 7 HAdV-C 10 Other
8 8 hCoV 84 hCoV
9 9 HHV-1 27 Other
10 10 HHV-2 3 Other
11 11 HHV-6B 1 Other
12 12 HIV-1 18 Other
13 13 HMPV 3 Other
14 14 HPV 37 Other
15 15 JCPyV 4 Other
16 16 NWV 12 Other
17 17 unknown 9 Other
18 18 VACV 9 Other
19 19 VZV 13 Other
我用过:
library(dplyr)
data <- tribble(
~id, ~virus, ~count,
1, "B19" , 21,
2, "BKPyV" , 8,
3, "CMV" , 161,
4, "Covid-19", 68,
5, "EBV" , 204,
6, "FLU-A" , 22,
7, "HAdV-C" , 10,
8, "hCoV" , 84,
9, "HHV-1" , 27,
10, "HHV-2" , 3,
11, "HHV-6B" , 1,
12, "HIV-1" , 18,
13, "HMPV" , 3,
14, "HPV" , 37,
15, "JCPyV" , 4,
16, "NWV" , 12,
17, "unknown" , 9,
18, "VACV" , 9,
19, "VZV" , 13
)
我目前正在处理一个包含 714 行的 tibble 格式的数据集(每行对应一个特定于给定病毒的新序列,但如果有意义的话,多个序列来自同一病毒)。
因此,如果您查看数据,例如21 个 B19 序列。
我想在我的 tibble 中创建一个新专栏,我将所有存在几次(低于 50 计数)的病毒株归为一组(“其他”),并且所有具有高计数的病毒株都保留在每个自己的组,所以 CMV 是 CMV。因此,这将是添加到 tibble 的新列,每当出现低计数应变时,'newID' 将是其他列(见图 1)。 到现在为止,我使用了 'mutate(newID = case_when(Origin == "CMV" ~ "CMV") 然后根据计数手动对其进行分组(参见数据图),但应该有一个更容易和更少的 'hard-coding'选项对吧?
数据:
1 B19 21
2 BKPyV 8
3 CMV 161
4 Covid-19 68
5 EBV 204
6 FLU-A 22
7 HAdV-C 10
8 hCoV 84
9 HHV-1 27
10 HHV-2 3
11 HHV-6B 1
12 HIV-1 18
13 HMPV 3
14 HPV 37
15 JCPyV 4
16 NWV 12
17 unknown 9
18 VACV 9
19 VZV 13
希望对您有所帮助!
您可以使用 forcats
包 (tidyverse) 中的 fct_lump()
。
根据您的统计,我正在使用排名前 4 的病毒:
library(forcats)
data %>%
mutate(virus = as.factor(virus)) %>%
mutate(newID = fct_lump(virus, 4, w = count))
输出为:
# A tibble: 19 × 4
id virus count newID
<dbl> <fct> <dbl> <fct>
1 1 B19 21 Other
2 2 BKPyV 8 Other
3 3 CMV 161 CMV
4 4 Covid-19 68 Covid-19
5 5 EBV 204 EBV
6 6 FLU-A 22 Other
7 7 HAdV-C 10 Other
8 8 hCoV 84 hCoV
9 9 HHV-1 27 Other
10 10 HHV-2 3 Other
11 11 HHV-6B 1 Other
12 12 HIV-1 18 Other
13 13 HMPV 3 Other
14 14 HPV 37 Other
15 15 JCPyV 4 Other
16 16 NWV 12 Other
17 17 unknown 9 Other
18 18 VACV 9 Other
19 19 VZV 13 Other
我用过:
library(dplyr)
data <- tribble(
~id, ~virus, ~count,
1, "B19" , 21,
2, "BKPyV" , 8,
3, "CMV" , 161,
4, "Covid-19", 68,
5, "EBV" , 204,
6, "FLU-A" , 22,
7, "HAdV-C" , 10,
8, "hCoV" , 84,
9, "HHV-1" , 27,
10, "HHV-2" , 3,
11, "HHV-6B" , 1,
12, "HIV-1" , 18,
13, "HMPV" , 3,
14, "HPV" , 37,
15, "JCPyV" , 4,
16, "NWV" , 12,
17, "unknown" , 9,
18, "VACV" , 9,
19, "VZV" , 13
)