Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为R中的循环重写初始数据集_R_Loops_For Loop - Fatal编程技术网

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

为R中的循环重写初始数据集,r,loops,for-loop,R,Loops,For Loop,UPD: 我需要的是: 以下是一些数据集的示例(我有8个): 我需要的是: 例如,在这些数据集中存在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

UPD: 我需要的是:

以下是一些数据集的示例(我有8个):

我需要的是:

例如,在这些数据集中存在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等中创建变量ff1ff2,分别为年份ID构建,在每一年分别为该特定年份的整个ID的中位数

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


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

这里有一个tidyverse方法:

库(dplyr)
#图书馆(purrr)
数据\u frameAB%>%
组别(年份)%>%
突变(ff1=(c+d)/purrr::map2_dbl(c,d,中位数))%>%
解组()
##A tibble:14 x 5
#身份证年份c d ff1
#        
#  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(中位数,c,d))
尽管类型安全

由于在数据管理中有多个帧,我有两个建议:

  • 将它们组合成一个
    列表
    。这个建议源于这样一个假设,即无论你对一个框架做什么,你都可能对这三个框架都做。在这种情况下,您可以在帧列表上使用
    lappy
    purrr::map
    ,一步完成所有帧。看

    列出\u帧的\u%
    变异(ff1=(c+d)/purrr::map2_dbl(c,d,中位数))%>%ungroup()
    )
    
    同样,如果没有
    purr
    ,那将是

    框架列表2%
    变异(ff1=(c+d)/mapply(中位数c,d))%>%
    解组()
    )
    
  • 将它们组合成一个帧,保留原始数据。从帧的列表开始

    bind\u行(帧列表,.id=“Frame”)%>%
    分组依据(框架,年份)%>%
    突变(ff1=(c+d)/purrr::map2_dbl(c,d,中位数))%>%
    解组()
    ##A tibble:42 x 6
    #帧ID年份c d ff1
    #         
    #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
    # # ... 还有32行
    

  • 这是R的tidyverse方言。
    ~
    波浪形像一个匿名函数,因此
    ~.x
    函数(.x).x
    相同。
    %%>%%
    是一个
    magrittr
    的“管道”,用于从语法上改变代码的外观,它更多的是一个数据管道,而不是对R来说正常的插入式嵌套。管道由
    dplyr
    包重新导出,而tidyverse流中的很多都使用它(通常,在实践中,imo是多余的)。我相信这不是我想要的。我的意思是,让我们看看2015年,例如。有两个ID 1和15。因此,我需要的是2015年ID 1的ff1应该是(14+16)/中位数(14+16和23+38),本质上是30/45.5=0.65,而不是2.14如果我尝试运行以下代码EE_list%groupu by(year)%%>%mutate(ff1=lev/purr::map2_dbl(lev,median),ff2=cash/purr::map2_dbl(cash,median))%%>%ungroup(),其中lev为c+d。我得到以下错误:
    error:Problem with
    mutate()`input
    ff1
    。缺少x参数“.f”,没有默认的i输入
    ff1
    is
    lev/purr::map2_dbl(lev,median)
    。我认为错误发生在第1组:年份=2011年。我希望你能理解,当你的问题是
    中位数(c+d)
    时,我解释为
    中位数(c+d)
    ,而不是那样。这是一个很好的机会,你可以编辑你的问题,并粘贴你的预期输出给定的样本数据;这样做将消除任何歧义。如果您打算以不同的方式使用建议的代码,那么您需要阅读帮助页面。在本例中,如果您阅读,您将了解到
    map2*
    pmap*
    函数“同时迭代多个参数”,因此需要不同的参数。
    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