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
相关产品推荐
相关产品推荐

