如何基于pos列匹配,用ifelse多选项比较R数据框列?
解决方案
首先,先确保两个数据框按pos列精准匹配,避免因行顺序不一致导致的错误,我们可以先将df2的ref列合并到df1中:
# 合并df1和df2的ref列,按pos匹配 df_merged <- merge(df1, df2[, c("pos", "ref")], by = "pos", all.x = TRUE)
接下来分别实现两种需求输出:
形式一:将df1中的'-'替换为2
df3_form1 <- df_merged # 遍历S01到S06列 for(i in 2:(ncol(df1))){ df3_form1[[i]] <- ifelse(df_merged[[i]] == "-", 2, ifelse(df_merged[[i]] == df_merged$ref, 1, 0)) } # 移除合并引入的ref列,还原原df1的列结构 df3_form1 <- df3_form1[, colnames(df1)] # 查看结果 df3_form1
输出结果:
pos S01 S02 S03 S04 S05 S06 1 1 1 1 2 0 0 0 2 2 1 1 2 1 1 1 3 3 1 1 2 1 1 1 4 4 1 1 0 1 1 1 5 5 1 1 0 1 1 1 6 6 1 1 0 1 1 1 7 7 1 1 0 1 1 1 8 9 1 1 0 1 1 1 9 12 1 1 1 1 1 1 10 15 1 1 1 1 1 1
形式二:保留df1中的'-'
注意:此形式下结果列会混合字符与数值,需将列转为字符类型:
df3_form2 <- df_merged # 遍历S01到S06列 for(i in 2:(ncol(df1))){ df3_form2[[i]] <- ifelse(df_merged[[i]] == "-", "-", ifelse(df_merged[[i]] == df_merged$ref, "1", "0")) } # 移除合并引入的ref列,还原原df1的列结构 df3_form2 <- df3_form2[, colnames(df1)] # 查看结果 df3_form2
输出结果:
pos S01 S02 S03 S04 S05 S06 1 1 1 1 - 0 0 0 2 2 1 1 - 1 1 1 3 3 1 1 - 1 1 1 4 4 1 1 0 1 1 1 5 5 1 1 0 1 1 1 6 6 1 1 0 1 1 1 7 7 1 1 0 1 1 1 8 9 1 1 0 1 1 1 9 12 1 1 1 1 1 1 10 15 1 1 1 1 1 1
替代方案(用dplyr简化逻辑)
如果已安装dplyr包,可用case_when让逻辑更清晰:
# 形式一的case_when版本 df3_form1[[i]] <- case_when( df_merged[[i]] == "-" ~ 2, df_merged[[i]] == df_merged$ref ~ 1, TRUE ~ 0 ) # 形式二的case_when版本 df3_form2[[i]] <- case_when( df_merged[[i]] == "-" ~ "-", df_merged[[i]] == df_merged$ref ~ "1", TRUE ~ "0" )
内容的提问来源于stack exchange,提问作者abraham
相关产品推荐
相关产品推荐

