You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:31:12