【问题标题】:For loop in R to rewrite initial datasetsR中的for循环重写初始数据集
【发布时间】:2021-02-08 15:18:06
【问题描述】:

更新: 这是我需要的:

这里有一些数据集的例子(我有 8 个): https://drive.google.com/drive/folders/1gBV2ZkywW6JqDjRICafCwtYhh2DHWaUq?usp=sharing

我需要的是:

例如,在那些数据集中有 lev 变量。假设这是这些数据集中数据的快照:

ID   Year  lev   
1    2011  0.19 
1    2012  0.19 
1    2013  0.21 
1    2014  0.18 
2    2013  0.39 
2    2014  0.15 
2    2015  0.47 
2    2016  0.35 
3    2013  0.30 
3    2015  0.1  
3    2017  0.13 
3    2018  0.78 
4    2011  0.13 
4    2012  0.35 

现在,我需要在我的每个数据集中创建EE_ABEE_CEE_H等,创建变量ff1 ff2 分别为年份 ID 构造,分别对应于该特定年份的整个 ID 的中位数。

我们以2011年为例,2011年这个数据集中变量lev的中位数是(0.19+0.13)/2 = 0.16,所以ff1 2011 年 ID 1 应为 0.19/0.16 = 1.1875,2011 年 ID 4 ff1 = 0.13/0.16 = 0.8125。

现在让我们以 2013 年为例。lev 的中位数为 0.3。因此 ID 1、2、3 的 ff1 将分别为 0.7、1.3、1。

所需的输出应该是每个数据集中的 ff1 变量(例如,EE_AB、EE_C、EE_H):

ID   Year  lev    ff1    
1    2011  0.19  1.1875
1    2012  0.19  0.7037
1    2013  0.21  0.7
1    2014  0.18  1.0909
2    2013  0.39  1.3
2    2014  0.15  0.9091
2    2015  0.47  1.6491
2    2016  0.35  1
3    2013  0.30  1
3    2015  0.1   0.3509
3    2017  0.13  1
3    2018  0.78  1
4    2011  0.13  0.8125
4    2012  0.35  1.2963

这对于其他数据帧应该是相同的。

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    这是一个tidyverse方法:

    library(dplyr)
    # library(purrr)
    data_frameAB %>%
      group_by(Year) %>%
      mutate(ff1 = (c+d) / purrr::map2_dbl(c, d, median)) %>%
      ungroup()
    # # A tibble: 14 x 5
    #       ID  Year     c     d   ff1
    #    <dbl> <dbl> <dbl> <dbl> <dbl>
    #  1     1  2011    10    12  2.2 
    #  2     1  2012    11    13  2.18
    #  3     1  2013    12    14  2.17
    #  4     1  2014    13    15  2.15
    #  5     1  2015    14    16  2.14
    #  6     1  2016    15    34  3.27
    #  7     1  2017    16    25  2.56
    #  8     1  2018    17    26  2.53
    #  9     1  2019    18    56  4.11
    # 10    15  2015    23    38  2.65
    # 11    15  2016    26    25  1.96
    # 12    15  2017    30    38  2.27
    # 13    45  2011   100   250  3.5 
    # 14    45  2012   200   111  1.56
    

    没有purrr,内部表达式将是

      mutate(ff1 = (c+d) / mapply(median, c, d))
    

    尽管具有类型安全性。

    由于您的数据管理中有多个框架,我有两个建议:

    1. 将它们组合成一个list。这个建议源于这样一个假设,即无论你对一帧做什么,你都可能对这三个帧都做。在这种情况下,您可以在帧列表中使用lapplypurrr::map,一步完成所有帧。见https://stackoverflow.com/a/24376207/3358227

      list_of_frames <- list(AB=data_frameAB, C=data_frameC, F=data_frameF)
      list_of_frames2 <- purrr::map(
        list_of_frames,
        ~ .x %>%
          group_by(Year) %>%
          mutate(ff1 = (c+d) / purrr::map2_dbl(c, d, median)) %>% ungroup()
      )
      

      同样,如果没有purrr,那将是

      list_of_frames2 <- lapply(
        list_of_frames,
        function(.x) group_by(.x, Year) %>%
          mutate(ff1 = (c+d) / mapply(median c, d)) %>%
          ungroup()
      )
      
    2. 将它们组合成一帧,保留原始数据。以list_of_frames开头,

      bind_rows(list_of_frames, .id = "Frame") %>%
        group_by(Frame, Year) %>%
        mutate(ff1 = (c+d) / purrr::map2_dbl(c, d, median)) %>%
        ungroup()
      # # A tibble: 42 x 6
      #    Frame    ID  Year     c     d   ff1
      #    <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
      #  1 AB        1  2011    10    12  2.2 
      #  2 AB        1  2012    11    13  2.18
      #  3 AB        1  2013    12    14  2.17
      #  4 AB        1  2014    13    15  2.15
      #  5 AB        1  2015    14    16  2.14
      #  6 AB        1  2016    15    34  3.27
      #  7 AB        1  2017    16    25  2.56
      #  8 AB        1  2018    17    26  2.53
      #  9 AB        1  2019    18    56  4.11
      # 10 AB       15  2015    23    38  2.65
      # # ... with 32 more rows
      

    【讨论】:

    • 这是 R 的 tidyverse 方言。~ 波浪号就像一个匿名函数,所以~ .xfunction(.x) .x 相同。 %&gt;% 是一个 magrittr “管道”,用于在语法上更改代码 外观 的方式,它更像是一个数据管道,而不是 R 中正常的括号嵌套。管道由 @987654339 重新导出@ 包,并且大部分 tidyverse 流程都使用它(通常,在实践中,过量,imo)。
    • 我相信这不是我想要的。我的意思是,让我们以 2015 年为例。有 2 个 ID 1 和 15。所以,我需要的是 2015 年 ID 1 的 ff1 应该是(14+16)/中位数(14+16 和 23+38),本质上是 30/45.5 = 0.65,而不是2.14
    • 如果我尝试运行以下代码 EE_list EE_list, ~ .x %>% group_by(Year) %>% mutate(ff1 = lev / purrr::map2_dbl(lev, median), ff2 = cash / purrr::map2_dbl(cash, median)) %>% ungroup() ),其中 lev 是 c+d。我收到以下错误:Error: Problem with mutate()` 输入ff1.x 参数“.f”丢失,没有默认值 i 输入 ff1lev/purrr::map2_dbl(lev, median)。i 组 1 中发生的错误:Year = 2011。`
    • 我希望您能理解,当您的问题提到median(c+d) 时,我将其解释为median(c+d) 而不是那个意思。给定样本数据,这是您编辑问题并粘贴预期输出的绝佳机会;这样做将消除任何歧义。
    • 如果您打算以不同的方式使用建议的代码,那么您需要阅读帮助页面。在这种情况下,如果您阅读过?map2_dbl,您会了解到map2*pmap* 函数“同时迭代多个参数”,因此需要不同的参数。
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多