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

时间:2014-03-22 17:34:46

标签: r dataframe append row named

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

我需要一次构建一行数据框。通过一些处理获得命名向量,并且它提供要插入的行的值。问题是命名向量的组件顺序与数据框列的顺序不同。这会使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

2 个答案:

答案 0 :(得分:5)

v2

之前的rbind中创建一个数据框
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 :(得分:3)

您可以重新排序矢量

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