在R中重新组织嵌套列表为数据框并转换数值为整数
问题
我有一个包含字符向量(character vectors)和数值向量(numeric vectors)的长列表list_a,希望将其重新组织为数据框(data frame)格式,同时需要把这些数值转换为整数。以下是list_a前两个元素的结构示例:
list_a <- list(ENSG00000040608 = list(var = c("chr22_20230714_G_A_b38", "chr22_20230737_G_A_b38", "chr22_20231229_T_A_b38", "chr22_20231474_G_A_b38", "chr22_20231667_C_G_b38", "chr22_20231957_G_C_b38", "chr22_20231969_G_T_b38", "chr22_20232125_G_A_b38", "chr22_20232392_G_A_b38", "chr22_20232643_A_C_b38" ), coeff = c(0.0000953181301665087, -0.00124036704551427, 0.000808061558738542, 0.000387528601423933, -0.000120624028990859, -0.00119982510044018, -0.000120623899338185, -0.000435011907222715, 0.000715410285903684, -0.000347899088267475)), ENSG00000040608 = list(var = c("chr22_20230714_G_A_b38", "chr22_20230737_G_A_b38", "chr22_20231229_T_A_b38", "chr22_20231474_G_A_b38", "chr22_20231667_C_G_b38", "chr22_20231957_G_C_b38", "chr22_20231969_G_T_b38", "chr22_20232125_G_A_b38", "chr22_20232392_G_A_b38", "chr22_20232643_A_C_b38" ), coeff = c(0.0000953181301665087, -0.00124036704551427, 0.000808061558738542, 0.000387528601423933, -0.000120624028990859, -0.00119982510044018, -0.000120623899338185, -0.000435011907222715, 0.000715410285903684, -0.000347899088267475)))
期望输出为list_b,结构如下:
list_b <- list(ENSG00000040608 = structure(list(chr22_20230714_G_A_b38 = -0.000347899088267475, chr22_20230737_G_A_b38 = 0.0000953181301665087, chr22_20231229_T_A_b38 = -0.00124036704551427, chr22_20231474_G_A_b38 = 0.000808061558738542, chr22_20231667_C_G_b38 = 0.000387528601423933, chr22_20231957_G_C_b38 = -0.000120624028990859, chr22_20231969_G_T_b38 = -0.00119982510044018, chr22_20232125_G_A_b38 = -0.000120623899338185, chr22_20232392_G_A_b38 = -0.000435011907222715, chr22_20232643_A_C_b38 = -0.000347899088267475), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame")), ENSG00000040608 = structure(list( chr22_20230714_G_A_b38 = -0.000347899088267475, chr22_20230737_G_A_b38 = 0.0000953181301665087, chr22_20231229_T_A_b38 = -0.00124036704551427, chr22_20231474_G_A_b38 = 0.000808061558738542, chr22_20231667_C_G_b38 = 0.000387528601423933, chr22_20231957_G_C_b38 = -0.000120624028990859, chr22_20231969_G_T_b38 = -0.00119982510044018, chr22_20232125_G_A_b38 = -0.000120623899338185, chr22_20232392_G_A_b38 = -0.000435011907222715, chr22_20232643_A_C_b38 = -0.000347899088267475), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame")))
解决方案
关键注意点
原数据中的coeff是极小的小数,直接转换为整数会全部变为0,因此需要先乘以一个合适的倍数(比如1e6,即10的6次方),保留有效数字后再转整数,后续可根据需要还原。
方法一:使用purrr和tibble包(推荐)
# 首次运行时安装所需包 install.packages(c("purrr", "tibble")) # 加载包 library(purrr) library(tibble) # 处理list_a生成目标list_b list_b <- map(list_a, function(sub_list) { # 将coeff乘以1e6后转为整数 int_coeff <- as.integer(sub_list$coeff * 1e6) # 用var作为列名,将整数向量转为tibble(匹配期望输出的类结构) as_tibble(setNames(list(int_coeff), sub_list$var)) }) # 查看结果结构 str(list_b)
方法二:基础R实现(无需额外包)
list_b <- lapply(list_a, function(sub_list) { # 转换整数 int_coeff <- as.integer(sub_list$coeff * 1e6) # 创建命名向量并转置为数据框 df <- as.data.frame(t(setNames(int_coeff, sub_list$var))) # 设置类为tbl_df、tbl、data.frame,匹配期望输出 class(df) <- c("tbl_df", "tbl", "data.frame") df })
结果说明
处理后的list_b中,每个元素都是tibble类型的数据框,列名为var中的字符值,对应的值为转换后的整数。如果需要调整整数精度,可修改乘以的倍数(比如1e5或1e7)。
内容的提问来源于stack exchange,提问作者Maya_Cent
相关产品推荐
相关产品推荐

