R语言lapply遍历数据框列表调用自定义列统计函数报错
错误产生原因
c()作用在多个数据框对象上时,不会生成「每个元素为独立数据框」的列表,而是会将所有数据框逐列拆解,合并为单个列向量组成的长列表,拆解后的向量不会保留原数据框的列索引结构。
执行length(plist)即可验证:返回值是8个数据框的总列数,而非预期的8(即8个数据框的集合长度)。此时lapply遍历plist时,每次传入response函数的dat参数是单独的无名列向量,并非完整数据框,执行dat[p](用字符型列名"f76a"索引向量)时,就会触发「无法用字符名称索引无名向量」的报错。
单独调用response(SOM_C, "f76a")可正常运行,是因为传入的是完整、带列名属性的数据框对象,索引逻辑成立。
对应解决方法
不要用c()组装待遍历的数据集集合,改用list()存储多个独立数据框,保证lapply遍历时每次传入的都是完整、带列名的原数据框:
# 正确组装待遍历的数据框集合 plist <- list(SOM_V, SOM_SD, SOM_C, SOM_L, SOM_M, SOM_KD, SOM_MP, SOM_SvD) # 批量调用函数即可正常运行 output <- lapply(plist, response, p = "f76a")
如果需要让输出结果和原数据框一一对应,组装列表时可直接为每个元素命名:
plist <- list( SOM_V = SOM_V, SOM_SD = SOM_SD, SOM_C = SOM_C, SOM_L = SOM_L, SOM_M = SOM_M, SOM_KD = SOM_KD, SOM_MP = SOM_MP, SOM_SvD = SOM_SvD )
内容的提问来源于stack exchange,提问作者Nick Olczak
相关产品推荐
相关产品推荐

