我有三个矢量:

V <-structure(list(mean = 1.34944359241928, sd = 0.57779881866326, 
           `0.025quant` = 0.196903771571785, `0.5quant` = 1.35295469982876, 
           `0.975quant` = 2.48177705326348, mode = NA_real_, kld = 1.9807860333589e-08), row.names = "MULT", class = "data.frame")

PC <- structure(list(mean = 1.34944359241928, sd = 0.57779881866326, 
           `0.025quant` = 0.196903771571785, `0.5quant` = 1.35295469982876, 
           `0.975quant` = 2.48177705326348, mode = NA_real_, kld = 1.9807860333589e-08), row.names = "MULT", class = "data.frame")


IF <- structure(list(mean = 1.34909620780277, sd = 0.584070365393511, 
                 `0.025quant` = 0.187046377119461, `0.5quant` = 1.35203229998754, 
                 `0.975quant` = 2.4943145617015, mode = NA_real_, kld = 1.67173434130176e-08), row.names = "MULT", class = "data.frame")

我想将这3个向量组合到一个数据集中,每个向量对应于数据集中的一个单独的行,向量的名称(V,PC,IF)位于第一列.

我知道如何组合它们,但找不到根据原始向量命名行的解决方案.

有什么建议吗?

推荐答案

Using tibble

你可以完全用R来做,但我会用tibble.第一个tibble::lst(),它自动从矢量的名称生成名称.然后,我们可以使用基R函数将它们绑定为具有行号的行,tibble::rownames_to_column()则生成第一列.

library(tibble)
lst(V, PC, IF) |>
    do.call(rbind, args = _) |>
    rownames_to_column("vec")

#   vec     mean        sd 0.025quant 0.5quant 0.975quant mode          kld
# 1   V 1.349444 0.5777988  0.1969038 1.352955   2.481777   NA 1.980786e-08
# 2  PC 1.349444 0.5777988  0.1969038 1.352955   2.481777   NA 1.980786e-08
# 3  IF 1.349096 0.5840704  0.1870464 1.352032   2.494315   NA 1.671734e-08

如果你正在使用tidyverse,你也可以这样做:

lst(V, PC, IF) |>
    dplyr::bind_rows(.id = "vec")

然而,这并没有剥离原始的行号属性,您需要在管道中添加另一行,所以如果您想删除行号,我看不出这种方法有什么好处.

底座R

当然,你可以创建一个命名列表,list(V=V, PC=PC, IF=IF).但是如果我们假设输入太多,你可以编写一个函数,自动命名列表中的元素,比如tibble::lst()(尽管在使用quos()的情况下).

lst2 <- function(...) {
    setNames(
        list(...),
        as.list(match.call())[-1]
    )
}

这是因为,作为R Language Definition个州,

调用对象的组件使用类似列表的语法来访问,并且实际上可以使用as.listas.call将其转换成列表或从列表转换成列表

我们使用as.list(match.call())[-1]来丢弃第一个元素,即函数名本身,在本例中是lst2.然后简单地说:

dat <- do.call(
    rbind,
    lst2(V, PC, IF)
)
cbind(vec = rownames(dat), dat)

#    vec     mean        sd 0.025quant 0.5quant 0.975quant mode          kld
# V    V 1.349444 0.5777988  0.1969038 1.352955   2.481777   NA 1.980786e-08
# PC  PC 1.349444 0.5777988  0.1969038 1.352955   2.481777   NA 1.980786e-08
# IF  IF 1.349096 0.5840704  0.1870464 1.352032   2.494315   NA 1.671734e-08

R相关问答推荐

找出疾病消失的受试者

将年度数据插入月度数据

更改默认系列1以更改名称

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

根据多个条件增加y轴高度以适应geom_text标签

如何在geom_col中反转条

当我们有多个特殊字符时,使用gsub删除名称和代码'

如何在观测缺失的地方添加零

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

2个Rscript.exe可执行文件有什么区别?

`lazy_dt`不支持`dplyr/across`?

从服务器在Shiny中一起渲染图标和文本

在R中创建连续的期间

在另一个包中设置断点&S R函数

将统计检验添加到GGPUBR中的盒图,在R

防止正则表达式覆盖以前的语句

如何在GALT包的函数&geom_x样条线中调整线宽

R中的Desolve:返回的导数数错误

合并多个数据帧,同时将它们的名称保留为列名?

如何在基数R中根据矩阵散点图中的因子给数据上色?