循环获取data.table各列最大值失败,结果为索引序列求助
问题原因
你的代码里d[, c(i)]的写法不符合data.table的索引逻辑:在data.table的j参数中,c(i)会被当作表达式求值,这里的i是循环变量,但data.table优先在数据表的列环境中查找变量,找不到才会回到父环境。最终d[, c(i)]返回的是长度为1的向量i,而非第i列的所有数据,所以max()的结果就是i本身,导致max_values变成1:10。
解决方案
以下是几种可行的修改方式:
方式1:直接用[[提取列(最直观的循环修改)
修改循环内的取值逻辑,用[[直接提取第i列的全部数据,这和data.frame的索引逻辑一致:
library(data.table) d <- data.frame(matrix(runif(100, 1, 100), ncol = 10)) setDT(d) max_values <- numeric(length = ncol(d)) for (i in 1:ncol(d)) { max_values[i] <- max(d[[i]]) }
方式2:用get()引用列名
通过列名来提取对应列,结合get()函数在data.table环境中求值:
for (i in 1:ncol(d)) { col_name <- colnames(d)[i] max_values[i] <- d[, max(get(col_name))] }
方式3:无循环的data.table高效写法(推荐)
利用data.table的lapply(.SD, ...)语法,一次性计算所有列的最大值,无需循环,效率更高:
max_values <- unlist(d[, lapply(.SD, max)]) # 或者转成向量 max_values <- as.vector(d[, lapply(.SD, max)])
方式4:用基础R的apply函数
如果习惯基础R写法,也可以直接用apply按列计算最大值:
max_values <- apply(d, 2, max)
内容的提问来源于stack exchange,提问作者user19340668
相关产品推荐
相关产品推荐

