gpt4 book ai didi

r - 在提取/替换操作期间保留对象属性的方法

转载 作者:行者123 更新时间:2023-12-04 11:30:38 25 4
gpt4 key购买 nike

最近我在我的 R 代码中遇到了以下问题。在接受数据框作为参数的函数中,我需要添加(或替换,如果存在)一列,其中包含基于数据框原始列的值计算的数据。我写了代码,但测试显示数据框提取/替换操作 ,我使用过,结果是 对象的特殊(用户定义)属性丢失 .

在意识到这一点并通过阅读 R 文档( http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.html )确认该行为后,我决定非常简单地解决这个问题——通过在提取/替换操作之前保存属性并在此之后恢复它们:

myTransformationFunction <- function (data) {

# save object's attributes
attrs <- attributes(data)

<data frame transformations; involves extract/replace operations on `data`>

# restore the attributes
attributes(data) <- attrs

return (data)
}

这种方法奏效了。然而,意外地,我遇到了另一篇 R 文档( http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.data.frame.html ),它为恕我直言提供了一个有趣的(并且可能是更通用的?) 替代方法 解决同样的问题:
## keeping special attributes: use a class with a
## "as.data.frame" and "[" method:

as.data.frame.avector <- as.data.frame.vector

`[.avector` <- function(x,i,...) {
r <- NextMethod("[")
mostattributes(r) <- attributes(x)
r
}

d <- data.frame(i = 0:7, f = gl(2,4),
u = structure(11:18, unit = "kg", class = "avector"))
str(d[2:4, -1]) # 'u' keeps its "unit"

如果这里的人们可以通过以下方式提供帮助,我将不胜感激:
  • 比较 上述两种方法,如果它们具有可比性(我意识到定义的第二种方法是针对数据框的,但我怀疑它可以推广到任何对象);
  • 讲解第二种方法中函数定义中的语法和含义,尤其是as.data.frame.avector ,以及这行 as.data.frame.avector <- as.data.frame.vector 的目的是什么.
  • 最佳答案

    我正在回答我自己的问题,因为我刚刚发现了一个 SO 问题( How to delete a row from a data.frame without losing the attributes ),其答案涵盖 大多数我上面提出的问题。但是,对于 的附加解释(针对 R 初学者)第二种方法 仍将不胜感激。

    更新:

    在对以下 SO 问题的回答中提出了此问题的另一种解决方案:indexing operation removes attributes .然而,就我个人而言,我更喜欢这种基于创建新类的方法,因为它在语义上更清晰。

    关于r - 在提取/替换操作期间保留对象属性的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841387/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com