如何在R语言数据框中正确标记行内列值相交的行
解决R语言Data Frame中标记相交值行的问题
嘿,我来帮你搞定这个问题!你遇到的问题根源是对intersect()函数的用法理解有点偏差,咱们一步步来拆解:
为什么你的代码没生效?
你原来的代码里,intersect(id, di)是对整个id列和di列计算交集,返回的是这两列的共同元素(在你的示例里就是c("good", "dirty"))。然后isTRUE()会把这个向量转换成单个逻辑值——但isTRUE()只接受单个布尔值,向量传入的话会直接返回FALSE,所以最终所有行的match列都变成了no.intersect,这显然不是你要的逐行判断效果。
正确的解决方案
根据你描述的需求(第1、4行明显有相交值),我分两种常见场景给你对应代码:
场景1:判断当前行的id和di值完全相等
如果你的“相交值”指的是同一行的id和di取值相同,直接用逐行比较就可以:
library(dplyr) # 示例数据框 df = data.frame(id=c("good","bad","ugly","dirty","clean","frenzy"), di=c("good",2,"good","dirty",4,"ugly")) # 新增match列 df %>% mutate(match = ifelse(id == di, "intersected", "no.intersect"))
运行结果:
id di match 1 good good intersected 2 bad 2 no.intersect 3 ugly good no.intersect 4 dirty dirty intersected 5 clean 4 no.intersect 6 frenzy ugly no.intersect
场景2:判断当前行的id在di列中存在,或di在id列中存在
如果你的“相交值”是更广义的——当前行的id出现在整个di列里,或者当前行的di出现在整个id列里,可以用%in%运算符实现:
df %>% mutate(match = ifelse(id %in% di | di %in% id, "intersected", "no.intersect"))
运行结果:
id di match 1 good good intersected 2 bad 2 no.intersect 3 ugly good intersected 4 dirty dirty intersected 5 clean 4 no.intersect 6 frenzy ugly intersected
这个结果里,第3行(di=good在id列存在)和第6行(di=ugly在id列存在)也会被标记为intersected,你可以根据实际需求选择对应的代码~
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

