配对数据的适当数据结构及其功能的扩展

时间:2012-07-05 15:51:51

标签: r

这个问题有2个部分。

  1. R中允许存储配对数据的数据结构是什么:

    0:0  
    0.5:10  
    1:20  
    

    (Python字典{[0]:0, [0.5]:10, [1]:20}

    以及如何使用一个衬垫启动它?即结合seq(0,1,by=0.5) 在此数据结构中使用seq(0,10,by=5)

  2. 假设我将0.25添加到列表中,然后我希望相邻节点的加权平均值(自动)出现在数据集中,即元素0.25:5和配对集会是

    0:0
    0.25:5  
    0.5:10  
    1:20  
    

    如果我添加元素0.3,则必须将其与5+(10-5)*(0.3-0.25)/(0.5-0.25)=6和元素0.3:6配对才能添加。

  3. 如何创建具有S4或Reference Class类模型的类,我可以使用此功能?

2 个答案:

答案 0 :(得分:1)

不确定您的目标是什么,但包hash可能包含您想要的内容

library(hash)
h<-hash(keys=seq(0,1,by=0.5),values=seq(0,10,by=5))
h[['0.25']]<-2.5

可能涉及问题的第一部分。 http://cran.r-project.org/web/packages/hash/hash.pdf可能会提到第二个问题。

带列表的类似构造

lst<-list()
lst<-seq(0,10,5)
names(lst)<-seq(0,1,0.5)
> lst['0.5']
0.5 
  5 
lst['0.25']<-2.5

对于第二部分,您可以构造一个简单的函数来使用新值更新散列/列表。

答案 1 :(得分:0)

两列data.frame似乎合适:

xy <- data.frame(x = seq(0, 1, by = 0.5), y = seq(0, 20, by = 10))
xy
#     x  y
# 1 0.0  0
# 2 0.5 10
# 3 1.0 20

然后,您要做的是线性插值,您可以使用approx函数来实现。例如:

approx(xy$x, xy$y, xout = 0.3)
# $x
# [1] 0.3
# 
# $y
# [1] 6

如果要将该结果添加到data.frame,可以执行以下操作:

xy <- as.data.frame(approx(xy$x, xy$y, xout = sort(c(xy$x, 0.3))))
xy
#     x  y
# 1 0.0  0
# 2 0.3  6
# 3 0.5 10
# 4 1.0 20

这有点贵,特别是如果您计划一次添加一个点。您可以改为一次添加所有点,因为结果与添加它们的顺序无关:

add.points <- c(0.25, 0.3)
xy <- as.data.frame(approx(xy$x, xy$y, xout = sort(c(xy$x, add.points))))
xy
#      x  y
# 1 0.00  0
# 2 0.25  5
# 3 0.30  6
# 4 0.50 10
# 5 1.00 20