如何基于二元向量生成新列?含R语言向量示例与规则
嘿,这个需求其实很好实现,我给你分享几个R语言里的实用方法,都能轻松搞定:
首先先把你的两个向量定义好(R里用<-或=都可以,我习惯用<-更清晰):
bad <- c(1,0,0,1,0,1,1) good <- c(1,0,0,0,1,0,0)
方法1:基础R的ifelse函数(最直接直观)
ifelse是R里专门做向量化条件判断的工具,完美匹配你的规则:
new_col <- ifelse(bad == good, bad, 1)
简单解释下逻辑:
- 第一个参数
bad == good会逐个对比两个向量的元素,返回一个由TRUE/FALSE组成的逻辑向量 - 当条件为
TRUE(也就是两个元素相等)时,我们直接取bad(或good,因为此时两者值一样) - 当条件为
FALSE(元素不等)时,直接返回1——刚好对应你说的“bad为1、good为0取1,反之亦然”的要求
运行后new_col的结果就是:[1] 1 0 0 1 1 1 1,完全符合预期。
方法2:简洁的向量化数值运算
因为你的向量都是0和1,我们可以用数值运算来实现同样的效果,代码更紧凑:
new_col <- (bad == good) * bad + !(bad == good)
这里的逻辑是利用R会自动把逻辑值转换成1(TRUE)和0(FALSE)的特性:
(bad == good) * bad:相等时保留原数值,不等时结果为0!(bad == good):取反后,不等时为1,相等时为0- 两者相加就刚好得到我们想要的结果,和方法1完全一致
方法3:用tidyverse的case_when(适合数据框场景)
如果你是在处理数据框(比如用dplyr做数据清洗),case_when会让代码的可读性更强,尤其是规则更复杂的时候:
library(dplyr) # 先把向量放到数据框里 my_df <- data.frame(bad = bad, good = good) # 生成新列 my_df <- my_df %>% mutate(new_col = case_when( bad == good ~ bad, # 相等时取原数值 TRUE ~ 1 # 所有不等的情况都返回1 ))
执行后,数据框里就会新增一列new_col,结果和前两种方法完全相同。
内容的提问来源于stack exchange,提问作者Lale Rzayeva
相关产品推荐
相关产品推荐

