R语言如何循环将split拆分列表批量转为对应ID命名的独立数据框
解决方案
批量生成独立命名数据框
你之前写的循环逻辑有误,使用assign()函数即可一次性完成所有列表元素到全局环境独立对象的转换,效果和手动单条赋值完全一致:
for (id in names(SD)) { assign( x = id, value = as.data.frame(SD[[id]]), envir = .GlobalEnv ) }
运行后全局环境会直接生成所有以对应ID为名称的data.frame对象,无需逐个手动赋值。
更适配ggplot绘图的优化方案(推荐)
不建议将上百个数据框全部直接放到全局环境,后期管理、修改的成本很高。你要灵活选取指定ID叠加绘图的需求,完全可以直接从命名列表SD中取数,无需提前拆分出独立对象:
library(ggplot2) ggplot(mapping = aes(x = Date, y = Mass)) + geom_line(data = as.data.frame(SD[["4469912"]]), aes(color = "4469912"), linewidth = 1) + geom_line(data = as.data.frame(SD[["4469822"]]), aes(color = "4469822"), linewidth = 1) + geom_line(data = as.data.frame(SD[["4469222"]]), aes(color = "4469222"), linewidth = 1) + scale_color_manual( values = c("4469912" = "red", "4469822" = "blue", "4469222" = "green"), name = "ID分组" )
注意:原绘图代码直接在
aes()内写col="red"的写法是错误的,这种写法不会将颜色和分组做映射,只会给所有线条统一赋值红色,也无法生成正确的图例,上述写法修正了这个问题。
如果需要批量叠加多个ID的图层,不用重复写geom_line,可以用循环快速生成:
# 先指定需要绘制的所有ID target_id_list <- c("4469912", "4469822", "4469222") # 初始化画布 plot_obj <- ggplot(mapping = aes(x = Date, y = Mass)) # 循环叠加图层 for (current_id in target_id_list) { plot_obj <- plot_obj + geom_line( data = as.data.frame(SD[[current_id]]), aes(color = current_id) ) } # 输出图形,可自定义配色 plot_obj + scale_color_viridis_d(name = "ID分组")
这种写法不需要在全局环境生成大量冗余对象,后续调整要绘制的ID集合只需要修改target_id_list的内容即可,效率更高。

内容的提问来源于stack exchange,提问作者Keldan Vanleer
相关产品推荐
相关产品推荐

