【问题标题】:Rerun same code but changing colums names at each loop重新运行相同的代码,但在每个循环中更改列名
【发布时间】:2020-05-08 15:07:31
【问题描述】:

我在 r 中有一个脚本来计算身体状况残差。我想将此代码应用于对应于特定个人类别的每一列。

例如,我将运行此代码来计算属于 1 类的所有个体的身体状况残差

1) 选择感兴趣的行

Data1 = RawData %>% select(ID,temperature, Bodysize1, mass1, year) %>%  filter((temperature %in% c(20:29) & Bodysize1 %in% c(20:100) & mass1 %in% c(15:40))

2) 使用创建的数据创建新模型

Model1 =lmer(log(mass1) ~ log(Bodysize1) + temperature + (1|year), data = Data1)

3) 提取残差并将ID添加到残差中

ResModel1 = resid(Model1)
ID=Data1$ID
Res1 =data.frame(ResModel1 ,ID)

4) 将残差添加到我的 RawData

RawData2.0 = merge(RawData, Res1, by = c("ID"), all.x = T)

为了避免重新运行此代码并手动将所有 1 更改为 2,然后将所有 2 更改为 3...等等,有没有办法执行此命令自动 whith 循环和应用系列?

我的数据

  ID        TEMPERATURE  BODYSIZE1 MASS1 BODYSIZE2 MASS2    YEAR
81-012       0.03830645     200    1450     205    1425     1981
84-069       0.26923078     200    1473     205    1498     1984
84-134       0.32692307     209    1448     195    1323     1984
84-145       0.27884614     197    1373     197    1498     1984
84-190       0.31129807     191    1248     195    1323     1984
85-155       0.33056709     198    1637     229    1988     1985

提前致谢

【问题讨论】:

    标签: r loops dplyr apply


    【解决方案1】:

    如果没有示例数据,很难说这是否可行,但也许创建一个函数可以简化您的工作流程

    图书馆(tidyverse)

    get_resid <- function(df,filters) {
    
    df_to_model <- df %>% filter({{filters}})
    df_to_keep <- df <- filter({{filters}},.preserve = FALSE)
    
    Data1 <-  df_to_model %>%
      select(ID,temperature, Bodysize1, mass1, year)
    
    Model1 <- lmer(log(mass1) ~ log(Bodysize1) + temperature + (1|year), data = Data1)
    
    
    ResModel1 <-  resid(Model1)
    ID <- Data1$ID
    Res1 <- data.frame(ResModel1 ,ID)
    
    Res1 %>% 
      bind_rows(df_to_keep)
    
    }
    

    那么你可以在你的管道中使用这个函数

    RawData %>% 
      get_resid(temperature %in% c(20:29) & Bodysize1 %in% c(20:100) & mass1 %in% c(15:40))
    

    【讨论】:

    • 嗨,谢谢你的回答,很遗憾我收到了这个错误消息:过滤器错误({:找不到对象'温度'
    • 你可能遇到了 quasiquotation 的问题,没有数据真的很难调试
    【解决方案2】:

    您可以尝试 i) 创建一个 tibble,在第一列中将所有 dep 变量作为字符串列出, ii) 在第二列中列出您的独立变量模型, iii) 在第三列中创建一个公式 iv) 在第四列运行你的模型

    
    df <- tibble(dep = paste0("log(var",seq(1,10,1),")"),
                 x = "~ your_x_vars") %>%
      mutate(formula = as.formula(paste0(dep,x))) %>%
      mutate(reg = map(formula, ~lm(as.formula(.x), data=df) ))
    

    然后你可以很容易地提取残差

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2020-01-17
      • 2021-06-23
      相关资源
      最近更新 更多