Измените фрейм данных с несколькими элементами в каждой позиции в фрейме данных

Фактически это продолжение предыдущего вопроса:

Сплайн по нескольким факторам во фрейме данных

так что извиняюсь за повторное прохождение первой части. И поверьте, я пытался решить сам!

Итак, некоторые образцы данных:

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

Спасибо за любую помощь!


person rsgmon    schedule 10.08.2012    source источник


Ответы (2)


Вы имеете в виду вот что:

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

Теперь вы можете спросить себя: «Как Джоран это понял?» Потому что до того, как я прочитал этот вопрос, я не имел ни малейшего представления о том, что возвращает spline.

Итак, моей первой остановкой было ?spline, и я перехожу к разделу Значение, где нахожу:

spline возвращает список, содержащий компоненты x и y, которые задают ординаты, в которых выполнялась интерполяция, и интерполированные значения.

Ага! Таким образом, для каждого фрагмента данных, который ddply отправляется нашей еще не записанной функции, он должен взять этот список из двух компонентов и просто преобразовать их во фрейм данных, чтобы ddply мог снова легко соединить вещи вместе.

Поэтому я пишу функцию, которая начинается с простой подгонки модели spline:

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

а затем берет результаты и упаковывает их во фрейм данных:

data.frame(Seconds = Spline$x,Speed = Spline$y) 
person joran    schedule 10.08.2012

Вероятно, это должен быть комментарий, но он слишком велик, поэтому (как показано в предыдущем вопросе сегодня по 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
person IRTFM    schedule 10.08.2012
comment
Так является ли x $ Spline вложенным списком? - person rsgmon; 10.08.2012
comment
Это возможное название для этого. Списки являются рекурсивными структурами, поэтому они могут содержать списки списков и списки списков списков, и .... красиво, чтобы вы могли полностью перейти к черепахам. - person IRTFM; 10.08.2012