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_AB、EE_C和EE_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))
尽管具有类型安全性。
由于您的数据管理中有多个帧,我有两个建议:
将它们组合成
list
。这个建议源于这样一种假设,即无论你对一帧做什么,你都可能同时做三帧。在这种情况下,可以在帧列表中使用lapply
或purrr::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() )
将它们组合成一帧,保留原始数据。从
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