You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数实现,无需手动创建列,代码可复用在后续的基因分析中:

  1. 提取抗生素与生物的唯一配对关系
library(tidyverse)

# 获取每个抗生素对应的唯一生物列表
abx_organism_unique <- df %>%
  select(Antibiotic, Organism) %>%
  distinct() %>%  # 去重,保留抗生素-生物的唯一配对
  mutate(value = "Yes")  # 标记存在作用关系
  1. 转换为宽格式矩阵
path_abx <- abx_organism_unique %>%
  pivot_wider(
    names_from = Organism,  # 生物名称作为列
    values_from = value,    # 填充"Yes"
    values_fill = list(value = "No")  # 无配对的填充"No"
  )

生成的path_abx即为目标矩阵:行是唯一抗生素,列是唯一生物,单元格用"Yes/No"标记是否存在作用关系。

  1. 复用代码处理基因的情况
    如果要处理基因与生物的关系,仅需替换字段名即可:
# 获取每个基因对应的唯一生物列表
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:33:31