You need to enable JavaScript to run this app. R语言逐行创建data.table直接赋值失效问题及解决方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

R语言逐行创建data.table直接赋值失效问题及解决方法咨询

差异原因
  • 筛选条件返回空结果:你提供的示例数据中New_Compare_Tax为因子类型,两行实际取值分别对应标签"2"和"1",不存在符合New_Compare_Tax == 0的行,第一次data.table查询返回的是0行对象,给空数据框的第1行赋值0行数据自然无法生成有效内容。
  • 两种赋值逻辑存在本质差异:第一种写法是给已存在的空数据框的指定行位置赋值,要求右侧对象的列数、列类型和左侧空数据框完全匹配,而你初始化的other_data是0列0行的空对象,本身没有对应列结构,即使查询返回有结果也会赋值失败;第二种写法是直接将计算结果覆盖赋值给变量,不需要匹配原有空对象的结构,所以只要查询返回有结果就能正常运行。
直接实现逐行赋值的方案

方案1:提前初始化匹配列结构的空数据框

如果必须用按行位置赋值的写法,先根据计算结果的列结构初始化空数据框再赋值:

library(data.table)
setDT(data)
# 提取要计算的数值列名,初始化对应结构的空数据框
num_cols <- names(data)[sapply(data, is.numeric)]
other_data <- data.frame(matrix(nrow = 0, ncol = length(num_cols), dimnames = list(NULL, num_cols)))
# 替换为符合你数据的筛选条件后赋值,示例为匹配New_Compare_Tax标签为"1"的分组
other_data[1,] <- data[New_Compare_Tax == "1", lapply(.SD, sum, na.rm = TRUE), .SDcols = num_cols]

方案2:用rbind动态追加行,无需提前初始化结构

如果不想提前确认列结构,用rbind动态追加计算结果更灵活:

library(data.table)
setDT(data)
other_data <- data.frame()
# 逐次计算不同分组的结果追加到other_data
other_data <- rbind(other_data, data[New_Compare_Tax == "1", lapply(.SD, sum, na.rm = TRUE), .SDcols = is.numeric])
other_data <- rbind(other_data, data[New_Compare_Tax == "2", lapply(.SD, sum, na.rm = TRUE), .SDcols = is.numeric])

方案3:用data.table分组语法一次性生成,无需手动逐行赋值

如果逐行赋值的本质是按分组做聚合统计,直接用by参数效率更高,不需要手动逐行操作:

library(data.table)
setDT(data)
# 按New_Compare_Tax分组聚合所有数值列的和
other_data <- data[, lapply(.SD, sum, na.rm = TRUE), .SDcols = is.numeric, by = New_Compare_Tax]
# 如需转回普通data.frame可运行setDF(other_data)
setDF(other_data)

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:51:03