如何在R中使用迭代函数从含公共字符的dataframe生成指定列表
问题描述
我现有如下dataframe,每个结果变量对应三次重复比较(因此子层级为12):
A tibble: 36 x 10 s .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif * <chr> <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr> 1 E value new_value_for_8 new_value_for_6 25 25 0.877 ns 1 ns 2 E value new_value_for_8 new_value_for_4 25 25 0.929 ns 1 ns 3 E value new_value_for_6 new_value_for_4 25 25 0.948 ns 1 ns 4 F value new_value_for_8 new_value_for_6 25 25 0.735 ns 1 ns 5 F value new_value_for_8 new_value_for_4 25 25 0.738 ns 1 ns 6 F value new_value_for_6 new_value_for_4 25 25 0.501 ns 1 ns 7 G value new_value_for_8 new_value_for_6 25 25 0.808 ns 0.808 ns 8 G value new_value_for_8 new_value_for_4 25 25 0.101 ns 0.303 ns 9 G value new_value_for_6 new_value_for_4 25 25 0.161 ns 0.321 ns 10 H value new_value_for_8 new_value_for_6 25 25 0.964 ns 0.964 ns
目前我通过手动分片的方式为三组重复测量各创建了包含对应统计量的12元素列表,代码如下:
my_comparisons <- list(E = comparisons[1:3,], F = comparisons[4:6,], G = comparisons[7:9,], H = comparisons[10:12,], I = comparisons[13:15,], J = comparisons[16:18,], K =comparisons[19:21,], L = comparisons[22:24,], M = comparisons[25:27,], N = comparisons[28:30,], O = comparisons[31:33,], P = comparisons[34:36,])
得到的输出格式如下:
[[E]] # A tibble: 3 x 10 s .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif <chr> <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr> 1 E value new_value_for_8 new_value_for_6 25 25 0.877 ns 1 ns 2 E value new_value_for_8 new_value_for_4 25 25 0.929 ns 1 ns 3 E value new_value_for_6 new_value_for_4 25 25 0.948 ns 1 ns [[F]] .... 其余元素以此类推
可以看到我是按照s(信号)列的公共特征拆分得到列表的,我希望使用lapply()、循环或者map()这类迭代函数,自动化完成上述列表的创建,请问应该如何实现?以下是原始数据集的样例:
> dput(head(df, 10)) structure(list(A = 1:10, C = c("Maybe", "Maybe", "Maybe", "Maybe", "Maybe", "Maybe", "Maybe", "Maybe", "Maybe", "Maybe"), D = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L), .Label = c("new_value_for_8", "new_value_for_6", "new_value_for_4"), class = "factor"), E = c(988.368784828308, 988.856158671407, 996.004085290553, 999.685844324618, 1000.23888564896, 1005.03749946898, 999.786378084971, 997.039675082569, 998.028313183065, 997.168905747014), F = c(994.834756009939, 994.468875098246, 1000.62150212342, 1002.23100741241, 1003.96990710863, 1007.75899775608, 998.699806256246, 996.401009591011, 998.076594704249, 1002.19344184533 ), G = c(1011.88022669726, 1012.10534266625, 1012.9554415821, 1015.09810043606, 1015.40462298842, 1016.67103699915, 1003.13771453335, 999.9107434841, 1002.15365554737, 1013.67789244066), H = c(988.221495702721, 990.850727928741, 992.418094914622, 995.984841639886, 993.398346143465, 997.971380355398, 1004.4672957051, 1002.54036572775, 1002.2292388993, 999.116379988893), I = c(994.035709684742, 994.890815628412, 997.18267770374, 998.564426335124, 996.851278420874, 1000.16039368502, 1003.52155765272, 1002.1043798945, 1002.7069399281, 1005.49897156208 ), J = c(1008.23981597718, 1009.51261484649, 1009.42367409926, 1005.06332653216, 1005.02619159395, 1009.07903916629, 1007.56089165218, 1005.49719893791, 1004.91476855238, 1013.03209535721), K = c(994.327042030287, 995.608170991922, 997.033470393412, 1000.15918365269, 998.216388150646, 1001.97377908784, 1003.17401220482, 1001.60211665164, 1002.27932356239, 1002.41479226363), L = c(999.225538268699, 999.349990537239, 1001.14010250645, 1001.51403741206, 1000.25571835554, 1003.76051565494, 1002.74763442988, 1001.09116707486, 1003.29833843754, 1006.55857216695 ), M = c(1009.99385579756, 1011.12126521731, 1010.6989716872, 1003.7899021821, 1004.59413830322, 1008.52123662618, 1006.34418311104, 1004.1077131243, 1004.94124365003, 1011.89121961563), N = c(999.801263745036, 996.838989582336, 1000.89599227983, 1003.11042068113, 1002.27800090558, 1003.83846437952, 1000.70169995102, 1001.75290674649, 998.660833714301, 1006.69246804854), O = c(1002.96437294923, 997.870867692911, 1002.94619035116, 1003.44844607015, 1003.02403433836, 1004.70457675466, 999.880559826981, 1000.66826545719, 999.59436981446, 1007.32640154038 ), P = c(1006.28027312932, 1005.24535230967, 1007.68162285336, 1001.08242973466, 1002.99896314, 1005.36085942954, 1001.22060069797, 1000.43007709819, 1000.47666761108, 1008.73650967215)), row.names = c(NA, 10L), class = "data.frame")
解决方案
直接用基础R的split()函数即可一键完成按s列分组拆分列表的需求,无需手动分片或者写循环:
my_comparisons <- split(comparisons, comparisons$s)
如果需要用purrr包的map系列函数实现,写法如下:
library(purrr) my_comparisons <- comparisons %>% group_split(s) %>% # 按s列拆分 set_names(unique(comparisons$s)) # 给列表元素设置对应s值的名称
两种方法得到的输出结构和手动分片的结果完全一致,且不管s列有多少个分组、每个分组有多少行都可以自动适配,不用手动调整索引范围。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

