R data.table中如何使用fcase实现多列同时批量赋值?
报错原因
你之前的写法报错是因为fcase默认返回单列向量,你传入的list("Yes", 1)长度为2,和条件向量的长度(和数据集行数一致)不匹配,所以触发长度校验错误。
最优解决方案:单轮遍历同时完成多列fcase赋值
直接在:=的多列赋值语法中,为每一列单独定义对应的fcase逻辑,该写法仅扫描一次数据集,效率远高于多次筛选赋值或merge操作,同时保留fcase的清晰分支逻辑:
library(data.table) data <- data.table(dummy=1:10) # 单次赋值同时生成test1、test2两列 data[, c("test1", "test2") := .( # 第一列test1的fcase逻辑 fcase( dummy < 5, "Yes", dummy > 7, "No", between(dummy, 5, 7), "Maybe" ), # 第二列test2的fcase逻辑 fcase( dummy < 5, 1, dummy > 7, 0, between(dummy, 5, 7), NA_integer_ ) )]
进阶简化:多条件批量生成(适合列数多、分支多的场景)
如果需要赋值的列和分支非常多,不想重复写判断条件,可以先把分支规则存为列表,批量生成赋值逻辑:
# 定义分支规则:每个条件对应各列的返回值 rules <- list( `dummy < 5` = list(test1 = "Yes", test2 = 1), `dummy > 7` = list(test1 = "No", test2 = 0), `between(dummy,5,7)` = list(test1 = "Maybe", test2 = NA_integer_) ) # 批量生成各列的fcase表达式 cols <- names(rules[[1]]) exprs <- lapply(cols, function(col) { call("fcase", unlist(lapply(seq_along(rules), function(i) { list(str2lang(names(rules)[i]), rules[[i]][[col]]) }), recursive = FALSE)) }) # 执行赋值 data[, (cols) := exprs]
该写法和手动写fcase效率完全一致,仅适合分支规则需要频繁修改、列数较多的场景,普通场景用第一种写法即可。
内容的提问来源于stack exchange,提问作者koolmees
相关产品推荐
相关产品推荐

