我想在mtcars数据集中做类似于将gpm(加仑每英里=1/mpg)模型与wt的拟合。这似乎很容易:
data(mtcars)
library(dplyr)
library(tidyr)
library(broom)
library(ggplot2)
library(scales)
mtcars2 <-
mtcars %>%
mutate(gpm = 1 / mpg) %>%
group_by(cyl, am)
lm1 <-
mtcars2 %>%
do(fit = lm(gpm ~ wt, data = .))
这就得到了一个有6行的行数据帧,正如预期的那样。
这张图确认了六组:
p1 <-
qplot(wt, gpm, data = mtcars2) +
facet_grid(cyl ~ am) +
stat_smooth(method='lm',se=FALSE, fullrange = TRUE) +
scale_x_continuous(limits = c(0,NA))
我可以使用augment()获得匹配的输出:
lm1 %>% augment(fit)
newdata <-
mtcars2 %>%
mutate(
wt = wt + cyl/4)
pred1 <-
lm1 %>%
augment(
fit,
newdata = newdata)
从其他地方的阅读中,我发现group_by和rowwise数据帧不兼容,因此lm1未分组,augment不能关联models和newdata。是否有另一种设计模式可以让我这样做?如果它像上面的尝试一样简单透明就好了,但更重要的是它能工作。
下面是我的sessionInfo():
> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] scales_0.4.0 ggplot2_2.1.0 broom_0.4.1 tidyr_0.6.0 dplyr_0.5.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.7 magrittr_1.5 mnormt_1.5-4 munsell_0.4.3
[5] colorspace_1.2-6 lattice_0.20-34 R6_2.1.3 stringr_1.1.0
[9] plyr_1.8.4 tools_3.3.1 parallel_3.3.1 grid_3.3.1
[13] nlme_3.1-128 gtable_0.2.0 psych_1.6.9 DBI_0.5-1
[17] lazyeval_0.2.0 assertthat_0.1 tibble_1.2 reshape2_1.4.1
[21] labeling_0.3 stringi_1.1.1 compiler_3.3.1 foreign_0.8-67
编辑:
newdata %>%
dplyr::select(cyl, am, wt) %>% # wt holds new predictor values
group_by(cyl, am) %>%
nest() %>%
inner_join(regressions, .) %>%
## looks like yours at this point
mutate(pred = list(augment(fit, newdata = data))) %>% # Error here
unnest(pred)
我认为不同之处在于,我在这个示例中有3个(ID...类似于mtcars中的行名)x2(cyl)x2(am)单位(每个示例有12个测量值),而mtcars示例中有3个(cyl)x2(am)单元格x每个单元格的car类型的随机数。在我的分析中,我需要查看ID值,但newdata同样适用于所有单元。如果它有帮助,就把它想象成在测试中施加在每辆车上的逆风的速度。这是否说明了Augment抱怨它不能处理类列表数据的原因?
编辑:将ID与newdata合并(使用full=true)解决了最后一个问题。我目前正在使用您的第一个建议解决方案。
对于这种情况,我使用了purrr包中的map2
。map2
同时在两个列表的元素中循环。列表的长度和顺序必须相同。
列表的元素用作要应用的某些函数的参数(在您的示例中为augment
)。在这里,您的两个列表是模型列表和数据集列表(每个cyl
/am
组合都有一个列表)。
使用map2_df
将结果作为data.frame而不是列表返回。
library(purrr)
我使用split
列出了要预测的Data.Frames列表。要拆分的因子的顺序决定了列表顺序,因此我确保它与lm1
的顺序相同。
test_split = split(newdata, list(newdata$am, newdata$cyl)
map2_df(lm1$fit, test_split, ~augment(.x, newdata = .y))
为了避免如此担心顺序问题,您可以按组嵌套
预测数据,将其加入LM1
中,并将augment
的结果作为列表返回,以便取消嵌套。
newdata %>%
group_by(cyl, am) %>%
nest() %>%
inner_join(lm1, .) %>%
mutate(pred = list(augment(fit, newdata = data))) %>%
unnest(pred)
我试过了 但这行不通。在我最初的方法中,我通过将每周编号1-4的dataframe与我的rawdata文件合并来解决这个问题。这样,我每篇文章有4周的时间(行),但是使用for循环的实现效率非常低,所以我试图用dplyr(或任何其他更高效的包/函数)做同样的事情。任何建议都将不胜感激!
问题内容: 我有一个pandas数据框,其中包含一个名为string的列。我想计算每个字符串的出现次数,然后将计数的数量除以所有计数的总和。我正在像这样在Pandas中尝试这样做: 此代码引发错误,“ DataFrame对象没有属性” size”。如何在Pandas中应用函数进行计算? 问题答案: 使用一个函数将其应用于 每个 值(而不是序列),并接受kwargs。因此,值没有方法。 也许这会工作
问题内容: 我有一个包含其他对象列表的对象,并且我想返回由容器的某些属性映射的所包含对象的平面图。如果可以仅使用stream和lambdas的话吗? 让我们假设一个操作列表: 结果将是实物 但我想把它弄平 问题答案: 您可以尝试类似:
问题内容: 我有一个电子邮件数组(可以是1封电子邮件,也可以是100封电子邮件),我需要用ajax请求发送该数组(我知道该怎么做),但是我只能发送一个包含以下内容的数组不超过10封电子邮件。因此,如果原始阵列中包含20封电子邮件,我将需要将其拆分为2个阵列,每组10个。或者,如果原始数组中有15封电子邮件,那么1数组中的10封电子邮件,以及另一个数组中的5封电子邮件。我使用的是jQuery,哪种方
我正在尝试使用 JOLT 根据属性将数组拆分为多个数组。我已经尝试过 JOLT“移位”规范,但无法实现。 我已经查看了几个完成数组转换的链接,但是我找不到任何将数组拆分成多个数组的方法。 示例:根据属性“type”的值将以下数组转换为3个数组。 输入: 输出: