为R中的循环重写初始数据集
UPD: 我需要的是: 以下是一些数据集的示例(我有8个): 我需要的是: 例如,在这些数据集中存在lev变量。假设这是这些数据集中数据的快照:为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
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_AB、EE_C、EE_H等中创建变量ff1和ff2,分别为年份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()`inputff1
。缺少x参数“.f”,没有默认的i输入ff1
islev/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