合并后维护数据框列的属性

时间:2013-11-30 23:25:18

标签: r merge

似乎merge导致数据框的列失去其属性:

attr(mtcars$mpg, "units") <- "miles.per.gallon"
new.df <- data.frame(gear=3:5, my.opinion=c("not enough", "just right", "too many"))
merged.df <- merge(new.df, mtcars)

attr(merged.df$mpg, "units")返回NULL

有没有办法让merge保留列的属性?

(解决方法是在合并之前查询每个数据框的每一列的属性,然后在合并之后重新分配它们。但这似乎不太优雅。)

2 个答案:

答案 0 :(得分:2)

还有data.table

library(data.table)

dt1 = as.data.table(mtcars)
dt2 = as.data.table(new.df)

inner.dt <- dt1[dt2, on = "gear"]

attr(inner.dt$mpg, "units")

...

> attr(inner.dt$mpg, "units")
[1] "miles.per.gallon"

但是...

library(microbenchmark)
microbenchmark(dplyr::inner_join(new.df, mtcars,"gear"),
               dt1[dt2, on = "gear"])

...

> microbenchmark(dplyr::inner_join(new.df, mtcars,"gear"),
+                    dt1[dt2, on = "gear"])
Unit: microseconds
             expr     min       lq     mean  median      uq      max neval
 dplyr            544.877 568.5840 625.6442 606.319 658.870 1005.197   100
 data.table       860.186 892.1915 961.2788 938.618 979.711 1510.166   100

答案 1 :(得分:0)

您可以编写一种合并方法并安排该方法以保留属性:

merge.foo <- function(...) {
  args <- list(...)
  attr <- lapply(args[[1]], function(x) lapply(x, attributes))
  attr <- unlist(attr, recursive=F)
  out <- Reduce(merge, args[[1]])
  for (col in names(attr)) attributes(out[,col]) <- attr[[col]]
  out
}

您需要创建一个数据帧列表,并将其作为参数传递给合并功能。您还需要将一个类属性(即'foo')添加到列表中。