R中的自定义属性传播

时间:2013-10-17 00:23:30

标签: r vector attributes dataframe

我刚开始学习R并且对属性传播感到好奇。

我想用自定义值注释一个向量(我假设属性是正确的方法吗?),我已经能够相当容易地做到了。 (如果这是X-Y问题,给予背景)

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

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

  1. 什么是不传播值的完整功能列表,或
  2. 我怎么找到这个?
  3. 有没有更好的方法来完成我正在做的事情?
  4. 目标是应用这些注释,在数据上调用任意(尽可能多)R函数,并确保维护属性。特别是数据框在这里也很重要。

    由于

2 个答案:

答案 0 :(得分:1)

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

c()包裹在向量周围就足以剥离其属性,因此类和属性相当脆弱。数据框是一个列表,所以这个建议实际上与flodel的建议没有对比。

答案 1 :(得分:0)

即使简单的添加也会破坏属性。在下一个示例中,仅保留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所说,他们很脆弱;可能太脆弱了你想要的东西。


为了扩展flodel的观点,一个能够有效传播所有内容的常用方法是使用带有类属性的列表。

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

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

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