如何基于条件创建新列:将数值为3的元素标记为Yes,其余为No
在R中基于条件给数据框创建新列
嘿,我来帮你搞定这个需求——给你的数据框新增一列,当指定列的元素值为3时标记"Yes",其他情况标记"No"。先把你提供的演示数据框代码修正下(原来的代码有小问题,比如列名和内置函数c()重名,还有序列生成的语法错误),正确的代码是这样的:
# 修正后的演示数据框 id <- c(1:50) col_c <- c(10:59) # 把列名改成col_c,避免和内置函数c()冲突 col_d <- seq(200, 152, by=-2) # 用seq()生成步长为-2的序列,原来的写法会报错 col_e <- seq(352, 400, by=2) df <- cbind.data.frame(id, col_c, col_d, col_e)
下面给你三种常用的实现方法,你可以根据自己的习惯选择:
方法1:基础R的ifelse()函数(最便捷)
这是处理这种向量化条件判断的首选方式,一行代码就能搞定。假设我们要判断的列是col_c,代码如下:
# 新增new_col列,根据col_c的值标记Yes/No df$new_col <- ifelse(df$col_c == 3, "Yes", "No")
简单解释下:ifelse()会逐行检查第一个参数的条件(这里是df$col_c == 3),满足条件的位置返回第二个参数"Yes",不满足的返回第三个参数"No",直接把结果赋值给数据框的新列new_col就行。
方法2:tidyverse风格的dplyr::mutate() + if_else()
如果你平时习惯用tidyverse系列工具,这种写法会更符合管道化的代码风格,而且if_else()比基础R的ifelse()类型检查更严格,不容易出现隐式类型转换的坑:
首先得先安装并加载dplyr包(如果还没装的话):
install.packages("dplyr") library(dplyr)
然后用管道操作新增列:
df <- df %>% mutate(new_col = if_else(col_c == 3, "Yes", "No"))
方法3:基础R的for循环(适合理解逻辑,不推荐大规模数据)
虽然循环处理数据框效率不高,但如果想搞清楚逐行判断的底层逻辑,也可以这么写:
# 先把新列初始化为"No" df$new_col <- "No" # 遍历每一行,满足条件就改成"Yes" for(i in 1:nrow(df)){ if(df$col_c[i] == 3){ df$new_col[i] <- "Yes" } }
最后提一句:如果你的目标判断列不是col_c,只需要把代码里的col_c换成你实际要指定的列名就好啦!
内容的提问来源于stack exchange,提问作者Tess
相关产品推荐
相关产品推荐

