R中两列表外观一致却不相等及model.matrix报错问题排查
问题出在这
手动敲的~B1这种表达式,R会自动把它转成formula类对象,还会自动生成terms属性——这正是model.matrix运行必须的元数据。但你用substitute生成的结果,只是个语言对象(call/language类型),虽然表面看表达式一模一样,但既没formula的类标识,也缺terms属性,所以identical不认它,model.matrix也会报错。
改一行代码就行
生成列表c的时候,把substitute的结果用as.formula()包一下,让R把它转成正经的formula对象,自动补上需要的属性:
# 修改后的c生成代码 c <- lapply(a, \(x) as.formula(do.call(substitute, list(x, f(b, "B")))))
验证效果
- 一致性检查:
identical(c, d) # [1] TRUE
- 跑
model.matrix:
model.matrix(c[[2]], model.frame(c[[2]], data, na.action = 'na.pass')) # 正常出结果,不会再报错
额外说明
用formula()代替as.formula()也能达到一样的效果,都是触发R对表达式的解析,生成formula类和对应的terms属性。
内容的提问来源于stack exchange,提问作者Phoebe
相关产品推荐
相关产品推荐

