如何在R数据框中判断SNPs列值是否存在于gained/lost列并生成STATUS列?
解决R数据框列值匹配生成STATUS列的问题
你的核心问题是原代码按行匹配对应位置的值,而非搜索整列的所有值,导致结果全部为NEUTRAL。下面提供几种实用的正确实现方式:
先构造示例测试数据
data_frame <- data.frame( SNPs = c("1_752566", "1_776546", "1_832918", "1_914852"), gained = c("1_949654", "1_1045331", "1_832918", "1_1247494"), lost = c("6_30022061", "6_30314321", "13_95612033", "1_914852"), stringsAsFactors = FALSE )
方法1:基础R嵌套ifelse
无需额外包,直接用原生函数实现逻辑判断:
data_frame$STATUS <- ifelse( data_frame$SNPs %in% data_frame$gained, # 先判断是否在gained整列 "GAINED", ifelse( data_frame$SNPs %in% data_frame$lost, # 再判断是否在lost整列 "LOST", "NEUTRAL" # 都不满足则设为NEUTRAL ) )
方法2:dplyr包的case_when(更清晰的多条件判断)
适合习惯tidyverse风格的用户,逻辑更直观:
library(dplyr) data_frame <- data_frame %>% mutate(STATUS = case_when( SNPs %in% gained ~ "GAINED", SNPs %in% lost ~ "LOST", TRUE ~ "NEUTRAL" ))
方法3:data.table包(适合大数据场景)
如果数据量较大,data.table的效率更高:
library(data.table) setDT(data_frame)[, STATUS := fcase( SNPs %in% gained, "GAINED", SNPs %in% lost, "LOST", default = "NEUTRAL" )]
原代码错误原因解释
你之前的代码data_frame$status <- data.frame(lapply(data_frame[1], %in%, data_frame[2:3]))中,data_frame[2:3]是将gained和lost作为一个数据框传入,%in%会默认按行进行位置匹配(即每个SNPs值只和对应行的gained、lost值比较),而非遍历整列的所有值,所以无法正确匹配到目标值,最终全部返回NEUTRAL。
内容的提问来源于stack exchange,提问作者user11924976
相关产品推荐
相关产品推荐

