使用Rbind时复制属性

ee7vknir  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个数据集,它有attributes,当我用这个数据做rbind()时,我失去了所有的属性。
在使用rbind()时,是否可以复制所有属性?两个数据集中的列数相同,包括列名。

可复制数据

> attr(output$column1, "metadata")$DP.SomeNumber1
NULL
> attr(output$column2, "metadata")$DP.SomeNumber2
NULL

> column1 <- rep(-0.01, 8)
> attr(column1, "metadata")$DP.SomeNumber1 <- "6200"
> column2 <- rep(0.05, 8)
> attr(column2, "metadata")$DP.SomeNumber2 <- "7200"
> data <- data.frame(column1, column2)

> attr(data$column1, "metadata")$DP.SomeNumber1
[1] "6200"
> attr(data$column2, "metadata")$DP.SomeNumber2
[1] "7200"

> newdata <- as.data.frame(matrix(0, nrow = 3, ncol = ncol(data)))
> colnames(newdata) <- colnames(data) 
> output <- rbind(newdata,data) 

> attr(output$column1, "metadata")$DP.SomeNumber1
NULL
> attr(output$column2, "metadata")$DP.SomeNumber2
NULL

当在data.table()库中使用rbindlist()时,我仍然没有属性:

> testdata <- rbindlist(list(newdata, data))
> attr(testdata$column1, "metadata")$DP.SomeNumber1
NULL
> attr(testdata$column2, "metadata")$DP.SomeNumber2
NULL

以上属性示例归功于MarkusN
谢谢

更新1

我尝试将copy.attributes()作为suggested here,但即使这样,属性也没有复制到新的 Dataframe 。

更新2

下面的工作,但我不能这样做,当我有1000+列。下面我专门复制附加到列的属性。

> column1 <- rep(-0.01, 8)
> attr(column1, "metadata")$DP.SomeNumber1 <- "6200"
> column2 <- rep(0.05, 8)
> attr(column2, "metadata")$DP.SomeNumber2 <- "7200"

> data <- data.frame(column1, column2)

> print(attributes(data$column1))
$metadata
$metadata$DP.SomeNumber1
[1] "6200"
> print(attributes(data$column2))
$metadata
$metadata$DP.SomeNumber2
[1] "7200"

> newdata <- as.data.frame(matrix(0, nrow = 3, ncol = ncol(data)))
> colnames(newdata) <- colnames(data)

> output <- rbind(newdata,data)

> attributes(output$column1) <- attributes(data$column1)
> attributes(output$column2) <- attributes(data$column2)

> attr(output$column1, "metadata")$DP.SomeNumber1
[1] "6200"
> attr(output$column2, "metadata")$DP.SomeNumber2
[1] "7200"

有什么建议吗,我如何递归地引用附加到列的属性?

更新3

对于我的问题,以下解决方案有效,因为我只有三个我感兴趣的属性:

columnNumber <- 1

for (columnNumber in 1:length(data)){
 output[1,columnNumber] <- attr(data[,columnNumber], "metadata")$DP.SomeNumber1
 output[2,columnNumber] <- attr(data[,columnNumber], "metadata")$DP.SomeNumber2
 output[3,columnNumber] <- attr(data[,columnNumber], "metadata")$DP.SomeNumber3
}

上面的解决方案是特定于情况的,但是只要可以访问带有属性的原始数据,就可以提取rbind()之后的属性(实际上rbind()在这里变得多余)。此外,列对齐不应与新数据集不同,否则解决方案需要更具适应性。

wgxvkvu9

wgxvkvu91#

很晚了,但我或多或少也想复制属性。以下是我的解决方案(参见here的一些谬误):

copyAttributes <- function(from, to) {
  fromAttributeNames <- names(attributes(from))
  protectedAttributes <- c("dim", "dimnames", "class", "comment",
                           "names", "row.names", "tsp")
  x <- setdiff(fromAttributeNames, protectedAttributes)
  if (length(x) > 0) {
    ind <- which(!fromAttributeNames %in% protectedAttributes)
    for (i in 1:length(ind)) {
      attr(x = to, which = fromAttributeNames[ind[i]]) <-
        attributes(from)[[ind[i]]]
    }
  }
  return(to)
}

希望这能帮到你的案子...

相关问题