如何根据另一列的值筛选R数据框中对应列的取值?
解决方法
你的代码没法运行的原因是select函数不能直接用行级的条件判断——select是用来选择整列的,不是逐行决定选哪个列的值。而且你最终要的是单个匹配值,不是保留某一列,所以得换个思路处理。
下面给两种可行的解法:
方法1:用dplyr完整流程提取值
indiv <- 19125 df <- data.frame(Code_barre = c(19124, 19125, 19132, 19131), ID = c("Jean","Paul","Marie","Georges"), cross = c(18,15,19,20), Names = c("2020","2021","2022", "2023")) result <- df %>% # 筛选出匹配Code_barre或cross的行 filter(Code_barre == indiv | cross == indiv) %>% # 根据匹配的字段选择对应列的值 mutate(target_val = case_when( Code_barre == indiv ~ ID, cross == indiv ~ Names )) %>% # 提取出目标值 pull(target_val) print(result) # 当indiv=19125时输出"Paul",indiv=19时输出"2022"
方法2:直接定位行和列提取(基础R写法)
如果不想用dplyr,也可以用基础R直接定位:
indiv <- 19 df <- data.frame(Code_barre = c(19124, 19125, 19132, 19131), ID = c("Jean","Paul","Marie","Georges"), cross = c(18,15,19,20), Names = c("2020","2021","2022", "2023")) # 找到匹配的行号 match_row <- which(df$Code_barre == indiv | df$cross == indiv) # 判断应该取哪一列 match_col <- if(df$Code_barre[match_row] == indiv) "ID" else "Names" # 提取值 result <- df[match_row, match_col] print(result)
原代码的问题总结
select函数的使用场景错误:它是用来选择整列的,不能用逐行的逻辑判断来决定选哪个列的值;- 如果你要的是单个值,而不是一个数据框列,用
pull或者直接索引提取更合适; - 单个值匹配时用
==比%in%更直观,两者功能一致但==语义更清晰。
内容的提问来源于stack exchange,提问作者Mmerose
相关产品推荐
相关产品推荐

