使用lapply加载多个R文件时如何避免列名前缀'wiot'
解决lapply批量加载Rdata时列名带'wiot'前缀的问题
首先咱们理清问题:你用方法2的lapply批量加载文件时,每个data frame的列名莫名多了wiot前缀,这是因为mget(load(x))返回的是一个命名列表,当你用as.data.table()转换时,列表元素的名字(也就是加载出来的对象名wiot)会被自动加到列名前面,形成类似wiot.VAR_NAME的格式。
方法2的问题根源
先看你原来的方法2代码:
filenames = lapply(seq(2000,2014), function(x) paste("WIOT", x, "_October16_ROW.Rdata", sep="")) wiod = lapply(filenames, function(x) as.data.table(mget(load(x))))
这里load(x)会把文件里的wiot对象加载到当前环境,mget(load(x))返回的是一个以wiot为名字的列表,把这个列表转成data.table时,就会把列表名作为列名前缀。
修正后的方法2代码
我们只需要直接提取加载出来的wiot对象本身,而不是用mget返回命名列表,这样转成data.table就不会带前缀了:
# 生成文件名列表(用sapply更简洁,返回向量而非列表) filenames = sapply(2000:2014, function(x) paste0("WIOT", x, "_October16_ROW.Rdata")) # 批量加载并处理列名 wiod = lapply(filenames, function(x) { # 加载文件,获取加载的对象名称 obj_name = load(x) # 直接提取对象并转成data.table dt = as.data.table(get(obj_name)) # 可选:清理环境中临时生成的wiot对象,避免污染全局环境 rm(list = obj_name, envir = .GlobalEnv) return(dt) }) # 可选:给列表元素按年份命名,方便后续索引调用 names(wiod) = paste0("wiot", 2000:2014)
为什么这样能解决问题?
load(x)返回的是加载到环境中的对象名称(这里固定是wiot),用get(obj_name)直接获取这个对象本身,而非mget返回的命名列表。- 直接将原始对象转成data.table时,列名会保持文件中存储的原始状态,不会被额外添加前缀。
- 加上
rm(list = obj_name)是为了避免临时加载的wiot对象占用全局环境空间,属于优化操作,可选但推荐。
两种方法的对比
- 方法1需要手动逐个加载赋值,代码冗余,当文件数量增加时维护成本高。
- 修正后的方法2保留了批量加载的简洁性,同时解决了列名前缀问题,还能通过给列表元素命名,方便后续按年份快速调用(比如
wiod$wiot2000)。
内容的提问来源于stack exchange,提问作者nymuffin
相关产品推荐
相关产品推荐

