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

在R中基于df2匹配结果为数据框df1修改列名的需求

解决方案

以下分别提供Python(Pandas)和R语言的实现方式,均能满足你的需求:

Python(Pandas)实现

1. 构造示例数据

import pandas as pd

# 构造df1
df1 = pd.DataFrame({
    'ACG': [3, 2, 1],
    'AGC': [2, 1, 1],
    'ACC': [1, 2, 1],
    'AAC': [1, 3, 1]
}, index=['gene1', 'gene2', 'gene3'])

# 构造df2
df2 = pd.DataFrame({
    'p': [0.6, 0.3, 0.05],
    'HTO': ['HTO1', 'HTO2', 'HTO1']
}, index=['ACG', 'AGC', 'AAC'])

2. 列名重命名逻辑

# 生成列名到HTO值的映射字典
hto_mapping = df2['HTO'].to_dict()

# 遍历df1列名,生成新列名:匹配到HTO则拼接,否则加UN_前缀
new_column_names = [f"{hto_mapping.get(col, 'UN')}_{col}" for col in df1.columns]

# 重命名df1的列
df1_renamed = df1.set_axis(new_column_names, axis=1)

# 查看结果
print(df1_renamed)

执行后输出结果与你期望的一致:

HTO1_ACG  HTO2_AGC  UN_ACC  HTO1_AAC
gene1          3         2       1         1
gene2          2         1       2         3
gene3          1         1       1         1

R语言(dplyr)实现

1. 构造示例数据

library(dplyr)
library(tibble)

# 构造df1
df1 <- tibble(
  gene = c("gene1", "gene2", "gene3"),
  ACG = c(3, 2, 1),
  AGC = c(2, 1, 1),
  ACC = c(1, 2, 1),
  AAC = c(1, 3, 1)
) %>% column_to_rownames("gene")

# 构造df2
df2 <- tibble(
  id = c("ACG", "AGC", "AAC"),
  p = c(0.6, 0.3, 0.05),
  HTO = c("HTO1", "HTO2", "HTO1")
) %>% column_to_rownames("id")

2. 列名重命名逻辑

# 生成行名到HTO值的命名向量
hto_vector <- df2$HTO
names(hto_vector) <- rownames(df2)

# 生成新列名
new_col_names <- ifelse(colnames(df1) %in% names(hto_vector),
                        paste0(hto_vector[colnames(df1)], "_", colnames(df1)),
                        paste0("UN_", colnames(df1)))

# 重命名df1的列
df1_renamed <- df1 %>% rename_with(~new_col_names)

# 查看结果
print(df1_renamed)

执行后输出结果:

HTO1_ACG HTO2_AGC UN_ACC HTO1_AAC
gene1          3        2      1        1
gene2          2        1      2        3
gene3          1        1      1        1

内容的提问来源于stack exchange,提问作者giegie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:45:47