似乎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
保留列的属性?
(解决方法是在合并之前查询每个数据框的每一列的属性,然后在合并之后重新分配它们。但这似乎不太优雅。)
答案 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')添加到列表中。