如何将R语言中的列表型列表SR2转为带正确列名的可读表格?
解决列表转表格时自定义列名的问题
问题背景
我有一个赋值给对象SR2的列表型列表,结构如下:
List of 16 num [1:5] 143 68 16 10 1 num [1:5] 60.1 28.6 6.7 4.2 0.4 num [1:5] 44 6 0 0 2 num [1:5] 84.6 11.5 0 0 3.8 num [1:5] 70 7 0 0 0 num [1:5] 90.9 9.1 0 0 0 num [1:5] 15 1 1 0 1 num [1:5] 83.3 5.6 5.6 0 5.6 num [1:5] 0 0 0 0 0 num [1:5] NaN NaN NaN NaN NaN num [1:5] 1 1 0 0 0 num [1:5] 50 50 0 0 0 num [1:5] 6 0 0 0 0 num [1:5] 100 0 0 0 0 num [1:5] 1 1 0 0 0 num [1:5] 50 50 0 0 0 attr(*, "dim")= int [1:2] 2 8 attr(*, "dimnames")=List of 2 chr [1:2] "n" "%" chr [1:8] "Researcher, scientist or scholar" "Research administrator" "Librarian" "Publisher" ...
我尝试用以下代码将其转换为易读表格,但列名被错误重命名:
SR3 <- lapply(SR2, as.data.frame, colnames = names(SR[[2]])) SR4 <- bind_cols(SR3)
输出结果的列名变成了X[[i]]...1这类格式,而我需要列标题是原SR2维度名称的组合,比如第一列要显示为“Researcher, scientist or scholar (n)”。
解决方案
1. 提取维度名称
先从SR2的属性中取出预设的维度名称:
# 获取行维度(数值类型:n/%)和列维度(职业名称) dim_attr <- attr(SR2, "dimnames") value_types <- dim_attr[[1]] # 结果为 c("n", "%") occupations <- dim_attr[[2]] # 结果为8个职业名称的向量
2. 生成自定义列名
将职业名称与数值类型组合成目标列名:
# 生成所有列名:职业名称 + (数值类型) target_colnames <- expand.grid(occupations, value_types) |> apply(1, function(x) paste0(x[1], " (", x[2], ")"))
3. 转换并设置列名
重新转换列表为数据框,直接应用自定义列名:
library(dplyr) # 将每个列表元素转置为行数据框,合并后设置列名 SR4 <- SR2 |> lapply(function(vec) as.data.frame(t(vec))) |> bind_cols() |> setNames(target_colnames)
运行后,SR4的列名就会是Researcher, scientist or scholar (n)、Researcher, scientist or scholar (%)这类符合需求的格式。
关键说明
- 原代码中
lapply里的colnames参数无效,因为as.data.frame处理向量时无法直接通过该参数设置列名,需要先转置向量为行结构再转数据框。 - 使用
expand.grid可以快速生成职业与数值类型的所有组合,再通过paste0拼接成规范列名。
内容的提问来源于stack exchange,提问作者NewbForever
相关产品推荐
相关产品推荐

