【问题标题】:How to use coef() on output of do() from dplyr如何在 dplyr 的 do() 输出上使用 coef()
【发布时间】:2015-10-11 02:15:55
【问题描述】:

我的问题几乎dplyr 0.3.0.9000 how to use do() correctly 中得到了回答,但还没有完全解决。

我有一些看起来像这样的数据:

> 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 都应该与 Index 成线性关系。计划是按序列对 myData 进行分组,然后在每个组上通过 do() 使用 lm()。代码是这样的(从帮助中无耻地解除):

library(dplyr)
myData_by_sequence <- group_by(myData, Sequence)
models <- myData_by_sequence %>% do(mod = lm(xSamples ~ Index, data = .))

这可行,但我得到的结果是 this 。 . .

> 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() on一个列表。

我真的觉得我在这里缺少一些明显的东西。 R 绝对不是我的主要语言。任何帮助将不胜感激。

编辑 试过 。 . .

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

【问题讨论】:

  • 试试myData %&gt;% group_by(Sequence) %&gt;% do(data.frame(Coef = coef(lm(xSamples~Index, data=.))))
  • 谢谢,你的回复很好,我可以处理结果,尽管结果是我的系数线性排列而不是列(所以行是交替的截距,索引)。感谢您的快速回答!
  • 试试myData %&gt;% group_by(Sequence) %&gt;% do(data.frame(Coef = as.list(coef(lm(xSamples~Index, data=.)))))
  • 在前面的代码中,它都堆叠在一个单独的列'Coef'中。我认为通过使用as.list,它将是两列,这是您的预期结果吗?
  • 您是否尝试过data.table 选项。它应该很快

标签: r dplyr lm


【解决方案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))

【讨论】:

  • 感谢您的快速响应!我的一个版本几乎就是这样,但没有正确的类型转换。
  • 只是好奇:假设您想将对象与 lms 一起保存。然后你将如何提取系数?
  • @FelipeGerard objectlist 列(如果您只使用lm。您可以使用lapply/sapply 提取列表元素
  • 我应该尝试一下。我试图将东西保存在 dplyr 中,我想只是因为我认为它应该更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多