我想使分布适合大型数据框的多个子集。子集将基于每个year
,并且分布将适合freq
。
示例数据框:
df<- data.frame(year=c(rep(1998, 15), rep(1999, 16)),freq=c(103, 115, 13, 2, 67, 36, 51, 8, 6, 61, 10, 21,
7, 65, 4, 49, 92, 37, 16, 6, 23, 9, 2, 6, 5, 4,1, 3, 1, 9, 2))
我已经尝试了以下方法来获得拟合分布的系数(alpha参数)以及相关统计信息的输出。
library(sads)
coef_vec<- NA
for (i in 1: length(unique(df$year))){
fit<- fitsad(df$freq[i], sad="ls")
coef_vec[i,] <- as.vector(t(do.call(rbind, coef(summary(coeff)))
[,1:2]))
}
我希望输出如下所示:
output<- data.frame(para=rep(c("Estimate", "Std.Errror", "z value",
"Pr(z)"),2),year=
c(rep(1998,4),rep(1999,4)),value=c(3.7439,2.2216,1.6852,0.09195,2.8246, 1.8690,1.5113,0.1307))
您会注意到,每年都报告alpha参数和统计信息。我从发现的另一个代码中修改了此代码,但无法正常工作。
答案 0 :(得分:2)
我们将使用split-apply-combine策略来解决此问题。
首先,我们将数据分为多个子集:
library(sads) # Be sure to specify what package you're using in your question
by_year <- split(df$freq, df$year)
然后,我们遍历子集,对每个子集应用一个函数,以创建具有所需输出的数据框。 (在这里,我们实际上是遍历每个子集的索引,即1、2,...,n,因为这使我们能够获取每个子集的名称,在本例中为年份)。
out <- lapply(seq_along(by_year), function(i) {
fitted <- fitsad(by_year[[i]], sad = "ls")
coefs <- coef(summary(fitted))
df <- data.frame(param = colnames(coefs),
year = names(by_year)[i],
value = as.vector(coefs))
df
})
最后,我们将输出合并为一个数据帧:
data.frame(do.call(rbind, out), row.names = NULL)
# param year value
# 1 Estimate 1998 2.82461397
# 2 Std. Error 1998 1.86900479
# 3 z value 1998 1.51129307
# 4 Pr(z) 1998 0.13071380
# 5 Estimate 1999 3.74388575
# 6 Std. Error 1999 2.22161670
# 7 z value 1999 1.68520778
# 8 Pr(z) 1999 0.09194849
使用tidyverse
方法进行拆分应用合并:
library(dplyr)
library(tidyr)
library(purrr)
fit <- function(x) {
values <- coef(summary(fitsad(x$freq, sad = "ls")))
data.frame(param = colnames(coefs), value = as.vector(values))
}
df %>%
group_by(year) %>%
nest(freq) %>%
mutate(values = map(data, fit)) %>%
select(year, values) %>%
unnest()
# # A tibble: 8 x 3
# year param value
# <dbl> <fct> <dbl>
# 1 1998 Estimate 2.82
# 2 1998 Std. Error 1.87
# 3 1998 z value 1.51
# 4 1998 Pr(z) 0.131
# 5 1999 Estimate 3.74
# 6 1999 Std. Error 2.22
# 7 1999 z value 1.69
# 8 1999 Pr(z) 0.0919