R中的自定义属性传播

Posted

技术标签:

【中文标题】R中的自定义属性传播【英文标题】:Custom Attribute Propagation in R 【发布时间】:2013-10-17 00:23:29 【问题描述】:

我刚开始学习 R,对属性传播很感兴趣。

我想用自定义值注释一个向量(我假设属性是这样做的正确方法?),我已经能够很容易地做到这一点。 (如果这是一个 X-Y 问题,请提供背景)

当我开始操作这些向量时,问题就开始了 - 我希望这些自定义注释能够传播,或者至少有一套定义明确的注释传播/丢失规则

我已经对此进行了一些研究,包括 this other SO question,特别针对子集功能,但我想进一步概括一下:

    不传播值的函数的完整列表是什么,或者 我如何找到这个? 有没有更好的方法来完成我正在做的事情?

目标是应用这些注释,在数据上调用任意(尽可能多)R 函数,并确保属性得到维护。数据框在这里也很重要。

谢谢

【问题讨论】:

关于3(也许),你可以使用一个列表:list(object = ..., attr1 = ..., attr2 = ...) 【参考方案1】:

我认为您需要采用将“自定义值”放入数据列而不是使用属性的做法。将此称为 X-Y 问题并不是非常具体,但它暗示了您拥有位置、数字数据并且希望按行注册字符数据的概念。这正是数据帧旨在支持的内容。

只需将c() 包裹在向量周围就足以剥离其属性,因此类和属性相当脆弱。数据框是一个列表,所以这个建议与 florel 的建议并不矛盾。

【讨论】:

谢谢,是的,在使用了这里的信息和我自己的实验之后,我决定使用数据框(具体来说是 data.table)。对不起,我不能投票 所以我告诉你为什么你会遇到问题,你基本上按照我的建议将值放在更持久的数据结构中,而不是存储在属性中,但你“不能投票”。那好吧。这不像我需要积分。 道歉 - 正如我在其他评论中所说,我没有足够的代表。确实是您的评论让我能够更好地研究基本事实并获得更好的理解,谢谢【参考方案2】:

即使是简单的加法也会破坏属性。在下一个示例中,只保留y 的属性:

x <- 1:5
attr(x, "foo") <- letters[1:3]

y <- 6:10
attr(x, "foo") <- letters[4:6]

x + y
## [1]  7  9 11 13 15
## attr(,"foo")
## [1] "d" "e" "f"

正如 DWin 所说,它们很脆弱;对于你想要的东西来说可能太脆弱了。


为了扩展弗洛德尔的观点,一种能够稳健传播所有内容的常用方法是使用具有类属性的列表。

lm 返回的模型就是一个典型的例子。输出太大,无法在此处显示,但如果您对 lm 对象执行 unclass,您会看到它只是一个列表。

model <- lm(Sepal.Length ~ Sepal.Width + Species, iris)
unclass(model)

然后你可以重载任何函数(现在是 S3 方法)来处理你的新类。

【讨论】:

感谢您的回答 - 我最终决定使用 data.table。但是,我将在另一个问题中深入探讨一些进一步的问题。谢谢! (对不起,我不能投票,没有足够的代表)

以上是关于R中的自定义属性传播的主要内容,如果未能解决你的问题,请参考以下文章