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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:55:14