使用order()排序data.frame的model_AIC列时遇一元运算符参数无效错误
问题:按model_AIC列排序data.frame时出错
数据结构示例
data <- structure(list(model_ID = list(model_table = character(0), model_info_2 = "S_M ~ 1 + average_Ca_LOG + (1 + average_Ca_LOG | ID)", model_info_2 = "S_M ~ 1 + average_Mg_LOG + (1 + average_Mg_LOG | ID)", model_info_2 = "S_M ~ 1 + average_K_LOG + (1 + average_K_LOG | ID)", model_info_2 = "S_M ~ 1 + average_Mn_LOG + (1 + average_Mn_LOG | ID)", model_info_2 = "S_M ~ 1 + average_Cu_LOG + (1 + average_Cu_LOG | ID)", model_info_2 = "S_M ~ 1 + average_Zn_LOG + (1 + average_Zn_LOG | ID)"), model_AIC = list(model_table = numeric(0), model_info_2 = "1504.62", model_info_2 = "1636.35", model_info_2 = "1620", model_info_2 = "1407.41", model_info_2 = "1855.04", model_info_2 = "1706.71"), model_BIC = list(model_table = numeric(0), model_info_2 = "1531.06251699724", model_info_2 = "1662.78856677628", model_info_2 = "1646.44040865957", model_info_2 = "1433.85260732148", model_info_2 = "1881.47787878473", model_info_2 = "1733.15601219833")), class = "data.frame", row.names = c("model_table", "model_info_2", "model_info_2.1", "model_info_2.2", "model_info_2.3", "model_info_2.4", "model_info_2.5"))
执行的排序代码
data[order(-data$model_AIC),][1:5,]
报错信息(中文翻译)
错误于 -data$model_AIC : 一元运算符的无效参数
错误原因
- model_AIC列是列表类型:该data.frame的model_AIC列存储的是列表,而非普通数值向量,无法直接对列表使用一元负号
-进行排序操作。 - 数值存储为字符串:列表中除第一行空元素外,其余AIC值均为字符串格式(如
"1504.62"),而非数值型,即使是向量也不能对字符串应用负号。 - 存在空元素:第一行
model_table对应的model_AIC是空的numeric(0),会干扰排序逻辑。
解决方法
步骤1:转换model_AIC为数值向量
用sapply将列表元素转换为数值型,空元素替换为NA:
# 新增数值型的model_AIC列 data$model_AIC_num <- sapply(data$model_AIC, function(x) { if (length(x) == 0) NA else as.numeric(x) })
步骤2:按转换后的列排序
使用转换后的数值列降序排序,用na.last = TRUE将空值(NA)放到最后:
# 降序排序并取前5行 sorted_data <- data[order(-data$model_AIC_num, na.last = TRUE), ][1:5, ]
简化写法(无需新增列)
也可直接在排序时完成转换:
sorted_data <- data[order(-sapply(data$model_AIC, function(x) if(length(x)==0) NA else as.numeric(x)), na.last = TRUE), ][1:5,]
验证结果
执行后会得到按AIC值从大到小排序的前5行数据,空行(model_table)会被排在最后。
内容的提问来源于stack exchange,提问作者confusedindividual
相关产品推荐
相关产品推荐

