0

这实际上是上一个问题的延续:

数据框中多个因子的样条

很抱歉再次经历第一部分。相信我,我试图解决自己!

所以一些样本数据:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                 ,as.numeric(c(1,2,3,10,20,30)),
                 as.numeric(c(5,10,20,20,15,10)))

给一些名字:

colnames(mydf)<-c("Model", "Class","Seconds", "Speed")

这使:

> mydf
  Model Class Seconds Speed
1     a     e       1     5
2     a     e       2    10
3     b     e       3    20
4     b     e      10    20
5     c     e      20    15
6     c     e      30    10

现在最初我需要对这些数据进行样条化,答案如下:

library("plyr")
ddply(mydf, .(Model), summarise, Spline = spline(x = Seconds, y = Speed))

这导致:

  Model                        Spline
1     a  1.0, 1.2, 1.4, 1.6, 1.8, 2.0
2     a             5, 6, 7, 8, 9, 10
3     b 3.0, 4.4, 5.8, 7.2, 8.6, 10.0
4     b        20, 20, 20, 20, 20, 20
5     c        20, 22, 24, 26, 28, 30
6     c        15, 14, 13, 12, 11, 10

顺便说一句,我什至无法在 R 中手动创建这个确切的结构,以便提供一个示例,即使是手动!

所以回到这个问题。我需要更改结果,使它们看起来像这样:

Model   Seconds Speed
a       1.0     5
a       1.2     6
a       1.4     7
a       1.6     8
a       1.8     9
a       2.0     10
b       3.0     20
b       4.4     20
b       5.8     20
b       7.2     20
b       8.6     20
b       10.0    20
c       20      15
c       22      14
c       24      13
c       26      12
c       28      11
c       30      10

谢谢你的帮助!

4

2 回答 2

3

你的意思是这样的:

foo <- function(x){ 
    Spline <- spline(x = x$Seconds, y = x$Speed)
    data.frame(Seconds = Spline$x,Speed = Spline$y) 
}
out <- ddply(mydf, .(Model),foo )

现在,您可能会问自己,“joran 是如何解决这个问题的?” 因为在我读到这个问题之前,我并没有最模糊的概念是什么spline回来了。

所以我的第一站是?spline,然后我跳到价值部分,在那里我发现:

spline 返回一个包含分量 x 和 y 的列表,其中给出了插值发生的坐标和插值值。

啊哈!因此,对于发送到我们尚未编写的函数的每一块数据ddply,它需要获取两个组件的列表并将它们简单地转换为数据框,以便ddply可以轻松地将它们重新组合在一起。

因此,我编写了一个函数,该函数通过简单地拟合spline模型开始:

Spline <- spline(x = x$Seconds, y = x$Speed)

然后获取结果并将其打包到数据框中:

data.frame(Seconds = Spline$x,Speed = Spline$y) 
于 2012-08-10T04:38:42.967 回答
1

这可能应该是一个评论,但它太大了,所以(如今天在 r-help 上关于列表作为列中的元素的早期问题中所示)我正在回答关于如何“手动”创建该结构的子问题:

 x <- data.frame(Model = rep(letters[1:3] , each=2) )
 x$Spline <- list(  list( 1.0, 1.2, 1.4, 1.6, 1.8, 2.0), 
                    list( 5, 6, 7, 8, 9, 10), 
                    list( 3.0, 4.4, 5.8, 7.2, 8.6, 10.0), 
                    list( 20, 20, 20, 20, 20, 20), 
                     list( 15, 14, 13, 12, 11, 10) )
x
#------------------
  Model                        Spline
1     a  1.0, 1.2, 1.4, 1.6, 1.8, 2.0
2     a             5, 6, 7, 8, 9, 10
3     b 3.0, 4.4, 5.8, 7.2, 8.6, 10.0
4     b        20, 20, 20, 20, 20, 20
5     c        20, 22, 24, 26, 28, 30
6     c        15, 14, 13, 12, 11, 10
于 2012-08-10T05:05:44.487 回答