如何在R中没有for循环的情况下绑定功能输出的多个数据帧

时间:2019-03-13 21:53:26

标签: r dataframe

我有以下数据框

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))    
}

2 个答案:

答案 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创建