【问题标题】:Change a dataframe with multiple elements at each position in the dataframe在数据框中的每个位置更改具有多个元素的数据框
【发布时间】:2012-08-10 04:19:25
【问题描述】:

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

Spline on multiple factors in data frame

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

所以一些示例数据:

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

感谢您的帮助!

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    你的意思是这样的:

    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,然后我跳到 Value 部分,在那里我找到了:

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

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

    因此我编写了一个函数,开始时只需拟合 spline 模型:

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

    然后将结果打包成一个数据框:

    data.frame(Seconds = Spline$x,Speed = Spline$y) 
    

    【讨论】:

      【解决方案2】:

      这可能应该是一个评论,但它太大了,所以(如今天早些时候关于 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
      

      【讨论】:

      • 那么 x$Spline 是嵌套列表吗?
      • 这是一个可能的名字。列表是递归结构,因此它们可以保存列表列表和列表列表的列表,并且......漂亮,因此您可以“一路乌龟”。
      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2013-10-16
      • 2022-11-27
      • 2020-02-12
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      相关资源
      最近更新 更多