R语言中为向量元素命名时如何避免原有名称干扰?
问题
当使用模型系数创建命名向量时,希望自定义元素名称,但直接赋值会继承coef()输出的原有后缀(如.z),示例代码如下:
x=rnorm(100) z=sample(c(0,1),100,replace=TRUE) y=.5*x+.5*x^2+z+rnorm(100) linMod=lm(y~x+z) quadMod=lm(y~poly(x,2)+z) Zcoefs=c(lin=coef(linMod)['z'],quad=coef(quadMod)['z'])
期望得到的向量名称:
> names(Zcoefs) [1] "lin" "quad"
实际结果:
> names(Zcoefs) [1] "lin.z" "quad.z"
已知两种方案但各有缺陷:
- 使用
setNames():需要手动对应元素与名称顺序,易出错Zcoefs=setNames(c(coef(linMod)['z'],coef(quadMod)['z']),c('lin','quad')) - 使用
unname():写法繁琐Zcoefs=c(lin=unname(coef(linMod)['z']),quad=unname(coef(quadMod)['z']))
寻求更优解决方案。
更优解决方案
方法1:双括号[[提取标量
用双括号[[提取系数时,返回的是不带名称的标量,赋值时不会继承原有后缀,写法简洁直接:
Zcoefs = c(lin = coef(linMod)[['z']], quad = coef(quadMod)[['z']])
验证结果:
> names(Zcoefs) [1] "lin" "quad"
方法2:列表批量处理(多模型场景更高效)
如果需要处理多个模型,可将模型存入列表,批量提取系数并自动继承列表名称,避免重复代码:
# 将模型存入命名列表 models = list(lin = linMod, quad = quadMod) # 批量提取每个模型的z系数 Zcoefs = sapply(models, function(m) coef(m)[['z']])
结果自动匹配列表名称:
> names(Zcoefs) [1] "lin" "quad"
方法3:tidyverse工具链(适合数据框操作场景)
若习惯使用tidyverse生态,可借助broom包提取系数后整理,适合后续需要数据框操作的场景:
library(broom) library(dplyr) library(tibble) Zcoefs = bind_rows( tidy(linMod) %>% filter(term == 'z') %>% mutate(model = 'lin'), tidy(quadMod) %>% filter(term == 'z') %>% mutate(model = 'quad') ) %>% column_to_rownames('model') %>% pull(estimate)
内容的提问来源于stack exchange,提问作者Adam C Sales
相关产品推荐
相关产品推荐

