R语言:从大型DataFrame构建抗生素-生物关联矩阵的方法求助
问题:构建抗生素-生物作用关系矩阵
我有一个包含396212条观测值、13个变量的大型DataFrame,字段包括生物名称(Organism)、抗生素名称(Antibiotic)、基因名称及位置等。需要从原DataFrame提取唯一的生物和抗生素信息,构建一个新的DataFrame:以唯一抗生素为行,每个唯一生物为列,用"Yes/No"填充对应单元格,用来表示该抗生素是否作用于对应生物。
示例DataFrame如下:
df <- data.frame(Organism = c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"), Antibiotic = c("X", "Y", "Z", "X", "X", "X", "X", "Y", "Y", "Z", "X", "Y"))
我已经手动创建了一个以唯一抗生素为行、生物名称为列且填充为NA的新DataFrame,但不知道如何从原DataFrame提取信息填充:
path_abx <- data.frame(Antibiotic = unique(df$Antibiotic)) path_abx$A <- NA path_abx$B <- NA path_abx$C <- NA
核心需求与尝试
我的核心需求是明确每种抗生素对应的作用生物,在新DataFrame(path_abx)中,根据原DataFrame中抗生素与生物的同现关系,将对应位置填充为"Yes"或生物名称。实际数据包含39种抗生素、11种生物,无法手动处理。
我尝试过使用unique、select、filter、n_distinct、if/then及for循环,但均未成功,尝试的代码(存在语法错误)如下:
test <- df %>% group_by(Organism) %>% filter(Antibiotic=="X" & Organism =="A", ignore.case = TRUE) test <- if (df$Organism(grepl("B", ignore.case = TRUE))) { print(df$Ecoli, "E.coli") }
解决抗生素的问题后,我还需要针对1400个基因执行相同操作,明确每个基因作用的病原体。
解决方案:用tidyverse快速构建关系矩阵
可以用dplyr配合tidyr的pivot_wider函数实现,无需手动创建列,代码可复用在后续的基因分析中:
- 提取抗生素与生物的唯一配对关系
library(tidyverse) # 获取每个抗生素对应的唯一生物列表 abx_organism_unique <- df %>% select(Antibiotic, Organism) %>% distinct() %>% # 去重,保留抗生素-生物的唯一配对 mutate(value = "Yes") # 标记存在作用关系
- 转换为宽格式矩阵
path_abx <- abx_organism_unique %>% pivot_wider( names_from = Organism, # 生物名称作为列 values_from = value, # 填充"Yes" values_fill = list(value = "No") # 无配对的填充"No" )
生成的path_abx即为目标矩阵:行是唯一抗生素,列是唯一生物,单元格用"Yes/No"标记是否存在作用关系。
- 复用代码处理基因的情况
如果要处理基因与生物的关系,仅需替换字段名即可:
# 获取每个基因对应的唯一生物列表 gene_organism_unique <- df %>% select(Gene, Organism) %>% # 替换为你的基因字段名 distinct() %>% mutate(value = "Yes") # 转换为宽格式矩阵 gene_path <- gene_organism_unique %>% pivot_wider( names_from = Organism, values_from = value, values_fill = list(value = "No") )
方法优势
distinct()确保每个配对只保留一条记录,避免重复计数pivot_wider自动根据唯一生物名称生成列,无需手动添加values_fill参数统一填充无匹配关系的单元格为"No",省去循环赋值的麻烦
内容的提问来源于stack exchange,提问作者Rachel Rollo
相关产品推荐
相关产品推荐

