如何用R的readxl包将.xlsx转为以首列为名的向量列表
解决readxl导入Excel后转命名向量列表的问题
首先,你遇到的错误是因为用错了scan()函数——这个函数是用来读取文本文件/连接的,不能直接处理read_excel()返回的数据框,所以才会报那些参数无效的错误。咱们换个正确的思路来实现你要的效果:
你的Excel结构是每行开头是向量名称,后面跟着对应的值(每行长度不固定),目标是把每行转成一个以开头值命名的向量,最后整合成一个列表。具体步骤如下:
1. 正确导入数据
首先确保你已经加载readxl包,然后导入Excel文件(因为没有表头,所以col_names=FALSE是对的):
library(readxl) xcel <- read_excel("my_data.xlsx", col_names = FALSE)
2. 转换为命名向量列表
我们可以用lapply遍历每一行,提取名称和对应的值,最后整合成目标列表:
# 遍历每一行处理 result_list <- lapply(1:nrow(xcel), function(row_num) { # 取出当前行的所有值,去掉空值(NA) current_row <- na.omit(unlist(xcel[row_num, ])) # 第一个元素作为向量名称,剩下的作为向量内容 setNames(list(current_row[-1]), current_row[1]) }) # 把嵌套的列表合并成一个单层列表 result_list <- unlist(result_list, recursive = FALSE)
如果你习惯用tidyverse的语法,也可以用purrr包来写,更简洁:
library(purrr) result_list <- xcel %>% split(1:nrow(.)) %>% # 按行拆分 map(~ na.omit(unlist(.x))) %>% # 移除每行的空值 map(~ setNames(list(.x[-1]), .x[1])) %>% # 命名向量 unlist(recursive = FALSE) # 合并为单层列表
验证结果
运行完上面的代码后,result_list就是你想要的结构:
> result_list $`row_1` [1] "A" "B" $`row_2` [1] "C" "D" "E" $`row_3` [1] "F" "G" "H" "I"
这样就完美实现了你要的效果啦!
内容的提问来源于stack exchange,提问作者user31888
相关产品推荐
相关产品推荐

