我有以下数据框
Year ID V1
2000 1 4
2000 2 1
2000 3 2
2001 1 3
2001 2 1
2001 3 5
.....
我有一个函数使用上述数据框和年份值,执行回归(针对ID的V1),然后返回一个数据框,其中包含该年份每个ID的拟合系数:
ID Coeff
1 4
2 1
3 2
.....
我想对一组年份值运行以上函数,提取该年份的ID及其对应的拟合系数,然后将它们绑定到数据框中:
Year ID Coeff
2000 1 4
2000 2 1
2000 3 2
2001 1 3
2001 2 1
2001 3 5
.....
我可以使用for循环来完成上述操作,但是我想知道是否有更好的选择(使用dplyr或其他方法)。
编辑:
data(iris)
set.seed(2)
iris$Sepal.Length <- as.factor(iris$Sepal.Length)
iris$Sepal.Width <- as.factor(iris$Sepal.Width)
iris$Random <- sample(0:1, size = nrow(iris), replace = TRUE)
fit_function <- function(df, Species) {
fit <- glm(Random ~ -1+Sepal.Length + Sepal.Width,
data = df[df$Species == Species,],
family = "binomial")
final_df <- data.frame(Species = Species, Name = names(coef(fit)), Coef = unname(coef(fit)))
return(final_df)
}
all <- c()
for (i in unique(as.character(iris$Species))) {
all <- rbind(all, fit_function(iris, i))
}
答案 0 :(得分:0)
您可以尝试在R中使用MySQL。假设您的第一个数据帧为 df1 ,而第二个数据帧为 df2 。然后您可以尝试:
if
由于ID在两个数据帧之间是通用的,因此您需要始终区分所使用的特定ID。
答案 1 :(得分:0)
到目前为止,我真的不太了解您的问题,如果没有可行的数据或代码,就很难确切知道您的要求。将来,您应该意识到使用dput()
包含数据样本并显示到目前为止的代码是有礼貌的。鉴于您所发布的信息,这就是我要解决的问题的方式:
library(tidyverse)
dat <- tribble(~"Year", ~"ID", ~"V1",
2000, 1, 4,
2000, 2, 1,
2000, 3, 2,
2001, 1, 3,
2001, 2, 1,
2001, 3, 5)
dat %>%
group_split(Year) %>%
map_df(~lm(V1 ~ as.factor(ID), data = .x) %>%
broom::tidy() %>%
select(term, estimate) %>%
mutate(YEAR = unique(.x$Year)))
#> # A tibble: 6 x 3
#> term estimate YEAR
#> <chr> <dbl> <dbl>
#> 1 (Intercept) 4. 2000
#> 2 as.factor(ID)2 -3. 2000
#> 3 as.factor(ID)3 -2. 2000
#> 4 (Intercept) 3. 2001
#> 5 as.factor(ID)2 -2. 2001
#> 6 as.factor(ID)3 2.00 2001
由reprex package(v0.2.1)于2019-03-13创建