Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何按模型列表中的出现顺序对系数名称的字符向量重新排序_R_Sorting_Stargazer_Tidyverse - Fatal编程技术网

R 如何按模型列表中的出现顺序对系数名称的字符向量重新排序

R 如何按模型列表中的出现顺序对系数名称的字符向量重新排序,r,sorting,stargazer,tidyverse,R,Sorting,Stargazer,Tidyverse,in R非常适合将多元回归模型显示为并排列,这是许多社会科学学科的标准样式。但是,这个包不能很好地使用knitr+pandoc,因为它生成的输出要么是HTML,要么是TeX,而不是Markdown 作为解决方案,我正在创建一个函数,该函数可以生成与stargazer创建的表类似的表,但它将输出保存为一个简单的数据帧,然后我可以在编织文档中使用类似于kable和pander的包进行渲染。对于像broom::tidy这样的函数,这样做很简单 然而,我被困在如何对模型中显示的系数排序上。以这三种模式为

in R非常适合将多元回归模型显示为并排列,这是许多社会科学学科的标准样式。但是,这个包不能很好地使用knitr+pandoc,因为它生成的输出要么是HTML,要么是TeX,而不是Markdown

作为解决方案,我正在创建一个函数,该函数可以生成与stargazer创建的表类似的表,但它将输出保存为一个简单的数据帧,然后我可以在编织文档中使用类似于
kable
pander
的包进行渲染。对于像
broom::tidy
这样的函数,这样做很简单

然而,我被困在如何对模型中显示的系数排序上。以这三种模式为例。使用stargazer显示时,最终系数顺序为
c(“wt”、“qsec”、“hp”、“cyl”、“齿轮”、“carb”、“drat”)
。所有系数的顺序主要基于第一个模型中的系数(
wt
qsec
cyl
gear
carb
)。当第二个模型作为新列追加时,
hp
行插入在
qsec
之后和
cyl
之前


lm0回答OP的Q

那么,最后,我该如何按照模型列表中的出现顺序对系数名称的字符向量进行排序或重新排序,并对列表中第一个模型的顺序进行优先级排序

以下是一个适用于任意数量模型的一行程序:

unique(names(unlist(lapply(list(lm0, lm1, lm2), coef))))[-1]
#[1] "wt"   "qsec" "cyl"  "gear" "carb" "hp"   "drat"
请注意,代码隐式假设第一个模型始终具有
(Intercept)
作为第一个系数,该系数通过负索引
[-1]
从结果向量中移除

如果不能保证这一点,那么使用它可能更安全

setdiff(unique(names(unlist(lapply(list(lm0, lm1, lm2), coef)))), "(Intercept)")
从结果向量中删除
(截取)
(如果有)且不考虑其位置。其余系数名称将保持其顺序:

#[1] "wt"   "qsec" "cyl"  "gear" "carb" "hp"   "drat"

编辑

目前还不清楚是哪个逻辑
stargazer
实现了对系数进行排序。但是,根据帮助页面,
stargazer
也以不可见的方式返回与字符向量相同的输出。此外,
table.layout
参数只能用于返回系数部分。这可用于按与
stargazer
相同的顺序提取系数名称:

sgt <- capture.output(stargazer::stargazer(lm0, lm1, lm2, type="text", table.layout = "t"))
setdiff(stringr::str_extract(sgt, "^\\w*"), c("", "Constant"))
#[1] "wt"   "qsec" "hp"   "cyl"  "gear" "carb" "drat"

中士哦,我喜欢这个简单。它缺少的一点是
hp
qsec
cyl
之间的位置,就像在stargazer中一样,所需的输出将
hp
放在前面,因为它是一个新变量,但它出现在现有变量之前,如
cyl
gear
@Andrew通过直接从
stargazer
output.Awesome提取系数名称找到了另一种解决方案。我曾尝试重新创建stargazer的原始逻辑,但它的代码包含200行嵌套循环,几乎难以理解。依靠stargazer来完成繁重的工作要容易得多,特别是在限制输出的情况下。另外,将其全部封装在捕获输出()中可以保持控制台输出的干净,因为stargazer会自动
cat()
s输出:
capture.output({sgt