使用rbindlist+lapply生成data.table时维度错误排查
问题分析与解决
错误原因
你批量执行时的核心问题是遍历方式不对:
- 单独测试时,你给
grab_fun传的是单个样本的qualit表(qualit_list[[1]])和单个样本的quant表(quant_list[[1]]),这时候函数里的quant_list是单个data.frame,用[10:10,9]索引没问题。 - 但批量执行
lapply(qualit_list, grab_fun, quant_list = quant_list)时,lapply会把qualit_list的每个元素依次传给grab_fun的第一个参数,而第二个参数quant_list被你直接传成了整个列表(不是对应位置的单个quant表)。这时候函数里的quant_list是整个大列表,用二维索引[10:10,9]自然会报“维度数量错误”——因为列表是一维结构,不能用行+列的二维索引。
另外你的函数参数名也有点混乱:函数定义的第二个参数是quant_list_list,但调用时传的是quant_list,虽然不影响运行,但容易混淆,建议统一命名。
修复方案
要同时遍历两个列表的对应元素,应该用Map(或mapply)代替lapply,它能同步迭代多个列表的对应位置元素:
- 先修正函数参数名(可选,但更清晰):
grab_fun <- function(qualit_df, quant_df) { data.table(Param1 = qualit_df[13:13, 7][[1]], Param2 = qualit_df[17:17, 7][[1]], Param3 = qualit_df[22:22, 7][[1]], Param4 = quant_df[10:10, 9][[1]]) }
- 用
Map批量执行,再转成data.table:
result_dt <- rbindlist(Map(grab_fun, qualit_list, quant_list))
补充说明
Map会自动把qualit_list[[1]]和quant_list[[1]]传给grab_fun,再把qualit_list[[2]]和quant_list[[2]]传给grab_fun,以此类推,完美匹配每个样本的两个表,这样就不会再出现维度错误了。
内容的提问来源于stack exchange,提问作者Howdyouride
相关产品推荐
相关产品推荐

