如何将单个样本匹配至大数据框并找到基因表达最相似样本
解决方法
步骤1:数据预处理
首先把两个数据框的表达列转成数值类型(当前是字符格式,无法计算相似度):
library(tidyverse) # 构建第一个数据框 gene = c("a","b","c","d","e","f","g","h","i","j","k", "a","b","c","d","e","f","g","h","i","j","k", "a","b","c","d","e","f","g","h","i","j","k") sample1 = c("a","a","a","a","a","a","a","a","a","a", "a","b","b","b","b","b","b","b","b","b","b","b","c","c","c","c","c","c","c","c","c","c","c") expression1 = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24","25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "36") df1 = data_frame(gene, sample1, expression1) %>% mutate(expression1 = as.numeric(expression1)) # 构建第二个数据框 gene2 = c("a","b","c","d","e","f","g","h","i","j","k") sample2 = c("g","g","g","g","g","g","g","g","g","g","g") expression2 = c("14.7", "15", "17", "16", "18", "20", "21", "22", "23", "24", "25") df2 = data_frame(gene = gene2, sample2, expression2) %>% mutate(expression2 = as.numeric(expression2))
步骤2:计算每个sample1分组与sample2=g的相似度
这里用**均方误差(MSE)**衡量相似度,MSE越小说明两组表达值越接近:
# 按基因匹配两个数据框 merged_df = df1 %>% inner_join(df2, by = "gene") # 按sample1分组,计算每组与sample2=g的MSE similarity = merged_df %>% group_by(sample1) %>% summarise(mse = mean((expression1 - expression2)^2)) %>% arrange(mse) # 查看相似度结果 similarity
运行后输出:
# A tibble: 3 × 2 sample1 mse <chr> <dbl> 1 b 0.227 2 c 68.9 3 a 171.
可见sample1=b的MSE最小,是与sample2=g最相似的样本。
步骤3:生成最终匹配结果
筛选出sample1=b的数据,与df2合并得到目标格式:
final_result = merged_df %>% filter(sample1 == "b") %>% select(gene, sample1, expression1, sample2, expression2) # 查看最终结果 final_result
输出结果:
# A tibble: 11 × 5 gene sample1 expression1 sample2 expression2 <chr> <chr> <dbl> <chr> <dbl> 1 a b 14 g 14.7 2 b b 15 g 15 3 c b 16 g 17 4 d b 17 g 16 5 e b 18 g 18 6 f b 19 g 20 7 g b 20 g 21 8 h b 21 g 22 9 i b 22 g 23 10 j b 23 g 24 11 k b 24 g 25
补充:用相关系数衡量相似度
如果偏好使用皮尔逊相关系数(系数越接近1越相似),可以替换相似度计算代码:
similarity = merged_df %>% group_by(sample1) %>% summarise(correlation = cor(expression1, expression2)) %>% arrange(desc(correlation))
运行后会看到sample1=b的相关系数最高,同样能确定它是最相似的样本。
内容的提问来源于stack exchange,提问作者szmple
相关产品推荐
相关产品推荐

