我的问题是几乎在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进行分组,然后在每个组中使用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()
步骤,我可以将第二列分解为线性模型列表,但我可以&# 39;在列表中使用do()
。
我真的觉得这里有一些显而易见的东西。 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
答案 0 :(得分:6)
尝试
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))