如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?

Posted

技术标签:

【中文标题】如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?【英文标题】:How to add a named vector as a row to a data frame, reordered according to column name order? 【发布时间】:2014-04-30 03:22:10 【问题描述】:

如何将命名向量添加到数据框中,向量的组件根据数据框的列名重新排序?

我需要一次构建一个数据框。命名向量是通过一些处理获得的,它为要插入的行提供值。问题是命名向量没有与数据框列的顺序相同的组件。这使得rbind 产生错误的结果。这是非常简化的示例代码:

df = data.frame(id=1:2, va=11:12, vb=21:22, vc=31:32)
v1 = c(id=4, va=14, vb=25, vc=NA)
df = rbind(df, v1)

到目前为止,这会产生正确的结果。现在下一个向量处理导致:

v2 = c(va=19, id=9, vc=34, vb=NA)
df = rbind(df, v2)

这会产生不正确的结果。正确的结果应该是

id va vb vc
1  1 11 21 31
2  2 12 22 32
3  4 14 25 NA
4  9 19 NA 34

【问题讨论】:

当你说“问题是命名向量没有与数据框列顺序相同的组件”,为什么你不能传入列的向量-names 并让它在函数内部进行重新排序?然后你可以做简单的rbind 【参考方案1】:

rbind之前用v2制作一个数据框:

rbind(df, as.data.frame(t(v2)))
##   id va vb vc
## 1  1 11 21 31
## 2  2 12 22 32
## 3  4 14 25 NA
## 4  9 19 NA 34

这就是为什么会这样:

v2 有名称,但它的作用类似于as.data.frame 的列向量:

as.data.frame(v2)
##    v2
## va 19
## id  9
## vc 34
## vb NA

因此,您必须转置数据以将其转换为正确的形式:

as.data.frame(t(v2))
##   va id vc vb
## 1 19  9 34 NA

【讨论】:

感谢您优雅的回答和 +1 的良好解释。它很好地满足了我的目的。【参考方案2】:

你可以重新排序向量

rbind(df, v2[names(df)])
  id va vb vc
1  1 11 21 31
2  2 12 22 32
3  9 19 NA 34


library(microbenchmark)
microbenchmark(rbind(df, v2[names(df)]),
               rbind(df, as.data.frame(t(v2))), times = 10000)
Unit: microseconds
                            expr     min      lq  median      uq      max neval
        rbind(df, v2[names(df)]) 212.773 219.305 222.572 294.895 15300.96 10000
 rbind(df, as.data.frame(t(v2))) 374.219 382.618 387.750 516.067 39951.31 10000

【讨论】:

这也接受v2 的“短”向量,用NA 填充缺失值。在某些情况下这可能是一个优势(并且可能会在其他情况下隐藏错误——它甚至会默默地接受一个包含太多元素的向量)。 有趣的方式。我需要在 v2 是“短向量”的背景下看待这个问题。我可能有类似的情况。

以上是关于如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?的主要内容,如果未能解决你的问题,请参考以下文章

在数据框中动态添加列,列名作为 List 中的元素

一种将不同长度的命名向量合并到 R 中的数据框(将名称信息保留为列名)的快速方法

将系列连接到具有列名的数据框中

重命名具有任意顺序和重复列名的多索引列

在 python 或 Pyspark 数据框中使用特殊字符重命名列

R中 如何将数据框中的空值显示为NA