R语言拆分dataframe并按a_id字段命名导出csv文件问题咨询
问题原因
- 你对
iwalk的功能理解有误:purrr包的iwalk遍历列表时,第二个传入的参数是列表元素的位置序号,不是直接写列名a_id就能自动读取原数据框的列值 str_c里的%s是占位符语法,只有配合sprintf函数才会被替换为实际值,直接写在str_c里会被当成普通字符串输出- 你在
map步骤删掉了sample_name列,也没有保留a_id列,拆分后的小数据框里已经没有文件名需要的标识信息,自然没法生成正确的文件名
修正后可直接运行的代码
推荐使用更稳妥的group_nest写法,不会出现分组顺序和id对应不上的问题:
library(tidyverse) metrics %>% # 替换原spread,功能一致更符合当前tidyverse规范,保留原spread写法也可正常运行 pivot_wider(names_from = base, values_from = pct) %>% # 保留a_id作为文件名来源 select(sample_name, a_id, Cycle = pos, R1.A, R1.C, R1.G, R1.T, R1.N, R2.A) %>% # 按两个字段分组嵌套,每个分组对应一行数据 group_nest(sample_name, a_id) %>% # 提前生成每个分组对应的存储路径 mutate(file_path = str_c('/home/Projects/', a_id, '.csv')) %>% # 遍历每个分组,把嵌套的小数据框写入对应路径 pwalk(function(data, file_path, ...) write_csv(data, file_path))
如果你要保留原来的group_split逻辑,也可以提前提取对应顺序的a_id列表适配:
# 提前按分组顺序提取唯一的a_id列表 id_list <- metrics %>% distinct(sample_name, a_id) %>% pull(a_id) metrics %>% spread(base, pct ) %>% select(sample_name,Cycle = pos,R1.A,R1.C,R1.G,R1.T,R1.N,R2.A) %>% group_split(sample_name) %>% map(select, -sample_name) %>% # .y是iwalk传入的分组序号,对应到提前准备好的id_list取值即可 iwalk( ~ write_csv(.x, str_c('/home/Projects/', id_list[.y], '.csv')))
内容的提问来源于stack exchange,提问作者nbn
相关产品推荐
相关产品推荐

