R语言多数据框列最大值提取问题:循环返回-Inf排查
解决R语言循环提取数据框列最大值返回-Inf的问题
别担心,刚接触R遇到这种小问题很正常~咱们先看看问题出在哪,再一步步解决。
问题根源
你循环里写的allcsvs$'i'是关键错误:这里的'i'是字符串字面量,不是循环变量i的实际值。R会去allcsvs里找名为"i"的元素,但你的列表元素名是'65002'这类编号,根本不存在名为"i"的元素,所以allcsvs$'i'返回NULL。对NULL执行max(..., na.rm = TRUE)就会得到-Inf,这就是你看到的结果。
而你单独测试allcsvs$'65002'时能成功,是因为你直接写了正确的元素名字面量。
修正后的循环代码
把allcsvs$'i'改成allcsvs[[i]]就行——[[ ]]可以接受变量作为索引,能正确引用循环变量i对应的列表元素:
for (i in myfiles_short){ nam2 <- paste("Max_Superheat_Value", i, sep = "") # 用[[i]]替代$'i',实现变量索引 assign(nam2, max(allcsvs[[i]]$SuperheatTemperature, na.rm = TRUE)) }
更优雅的R风格写法
用assign会在全局环境里生成一堆零散变量,不太便于管理。推荐把结果存在一个列表里,这更符合R的编程习惯:
# 用lapply遍历,直接生成存储所有最大值的列表 max_superheat_list <- lapply(myfiles_short, function(x) { max(allcsvs[[x]]$SuperheatTemperature, na.rm = TRUE) }) # 给列表元素命名,方便查看 names(max_superheat_list) <- myfiles_short # 如果确实需要把每个最大值单独存为全局变量,再用list2env list2env(max_superheat_list, envir = .GlobalEnv)
这样你既可以通过max_superheat_list$65002查看单个值,也能统一管理所有结果,比零散的变量更整洁。
内容的提问来源于stack exchange,提问作者George humphrey
相关产品推荐
相关产品推荐

