在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
相关产品推荐
相关产品推荐

