Как использовать coef() на выходе do () из dplyr
Мой вопрос почти ответил в dplyr 0.3.0.9000 как использовать do() правильно, но не совсем.
У меня есть некоторые данные, которые выглядят так:
> head(myData)
Sequence Index xSamples ySamples
6 0 5 0.3316187 3.244171
7 0 6 1.5131778 2.719893
8 0 7 1.9088933 3.122991
9 0 8 2.7940244 3.616815
10 0 9 3.6500311 3.519641
Последовательность на самом деле колеблется от 0 до 9999. В каждой последовательности и xSamples,и ySamples должны быть линейными по отношению к индексу. План состоит в том, чтобы сгруппировать myData по последовательности, а затем использовать lm()
через do()
для каждой группы. Код звучит примерно так (бесстыдно снят с справка):
library(dplyr)
myData_by_sequence <- group_by(myData, Sequence)
models <- myData_by_sequence %>% do(mod = lm(xSamples ~ Index, data = .))
Это работает, но результат, который я получаю, таков . . .
> head(models)
Source: local data frame [10000 x 2]
Sequence mod
1 0 <S3:lm>
2 1 <S3:lm>
3 2 <S3:lm>
4 3 <S3:lm>
5 4 <S3:lm>
6 5 <S3:lm>
. . . и данные, которые мне нужны, застряли во второй колонке. У меня есть рабочее решение plyr
, которое выглядит следующим образом . . .
models <- dlply(myData, "Sequence", function(df) lm(xSamples ~ Index, data = df))
xresult <- ldply(models, coef)
. . . и это дает мне результаты, разбитые на фрейм данных благодаря coef()
. Загвоздка в том, что я не могу смешать dplyr (который я обычно использую и люблю) с plyr, и я, кажется, не могу получить coef()
работу с этим вторым столбцом из вывода dplyr.
Я пробовал ... несколько других подходов, таких как попытка coef()
и lm()
шаги вместе, и я могу разбить второй столбец в список линейных моделей, но я не могу использовать do()
в списке.
edit Попробовали . . .
result <-
rects %>%
group_by(Sequence) %>%
do(data.frame(Coef = coef(lm(xSamples ~ Frame, data = .))))
. . . и получится что-то очень близкое, но с коэффициентами, уложенными в одинаковые колонка:
Sequence Coef
1 0 -5.0189823
2 0 1.0004240
3 1 -4.9411745
4 1 0.9981858
1 ответ:
Попробуйте
library(dplyr) myData %>% group_by(Sequence) %>% do(data.frame(setNames(as.list(coef(lm(xSamples~Index, data=.))), c('Intercept', 'Index'))) # Sequence Intercept Index #1 0 -3.502821 0.7917671 #2 1 3.071611 0.3226020
Или используя
data.table
library(data.table) setDT(myData)[, as.list(coef(lm(xSamples~Index))) , by = Sequence] # Sequence (Intercept) Index #1: 0 -3.502821 0.7917671 #2: 1 3.071611 0.3226020
Данные
myData <- structure(list(Sequence = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L), Index = c(5L, 6L, 7L, 8L, 9L, 15L, 6L, 9L, 6L, 10L), xSamples = c(0.3316187, 1.5131778, 1.9088933, 2.7940244, 3.6500311, 7.3316187, 4.5131778, 9.9088933, 3.7940244, 4.6500311), ySamples = c(3.244171, 2.719893, 3.122991, 3.616815, 3.519641, 3.244171, 8.719893, 5.122991, 7.616815, 5.519641)), .Names = c("Sequence", "Index", "xSamples", "ySamples" ), class = "data.frame", row.names = c(NA, -10L))