R语言:如何在data.table中按指定条件生成新列M
用data.table生成新列M的解决方案
针对你的需求,直接用data.table原生的赋值语法:=就能高效解决,比case_when或apply更适配data.table的使用场景,具体步骤如下:
1. 修正初始数据的小问题
你原代码里w列的09,18是输入错误,应该改为09.18;另外R里数字的前导零(比如01.05)会被自动解析为1.05,可以直接写不带前导零的数值:
library(data.table) data <- data.table( x = c(1,2,3,4,5), y = c(7,6,8,9,10), z = c('a','b','c','d','e'), w = c(1.05, 3.04, 11.08, 5.07, 9.18) )
2. 生成M列的两种方法
方法一:用ifelse(简单直观)
直接通过条件判断赋值,满足x=3/5或y=7时取w,否则设为NA:
data[, M := ifelse(x %in% c(3,5) | y == 7, w, NA)]
方法二:用fcase(data.table专属的多条件函数,更高效)
如果后续有更多条件,fcase比ifelse更清晰,且性能更好:
data[, M := fcase( x %in% c(3,5) | y == 7, w, default = NA_real_ # 指定数值型NA,避免类型不一致问题 )]
3. 验证结果
运行后你的data.table会变成:
> data x y z w M 1: 1 7 a 1.05 1.05 2: 2 6 b 3.04 NA 3: 3 8 c 11.08 11.08 4: 4 9 d 5.07 NA 5: 5 10 e 9.18 9.18
为什么之前的方法没成功?
- 用dplyr的
case_when需要结合mutate,但data.table更推荐用:=直接修改,混用不同包的语法容易出错; apply是逐行操作,不仅效率低,而且data.table的优势是按列处理,完全没必要用逐行循环类的函数。
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

