用于R中的循环重写初始数据集



UPD:这里我需要什么:

下面是一些数据集的示例(我有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等,创建为年份ID构建的变量ff1以及ff2,分别为该特定年份的整个ID的中值。

让我们以2011年为例。2011年该数据集中变量lev的中位数为(0.19+0.13)/2=0.16,因此2011年ID 1的ff1应为0.19/0.16=1.1875,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

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

这里有一个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
    

最新更新