zscoredfile=scale(data) colnames(zscoredfile)<-c("ZL","ZR","ZF","ZM","ZC")Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric
时间: 2023-07-06 08:29:37 浏览: 94
这个错误通常出现在你试图对非数值型数据进行标准化操作。在你的代码中,`data`可能包含一些非数值型的变量,导致`scale()`函数无法正常运行。
你可以使用`select()`函数从数据中选择数值型变量,然后将这些变量传递给`scale()`函数。例如,假设你要选择`data`中的第1、2、3、4和6列作为数值型变量,可以使用以下代码:
```
num_cols <- c(1, 2, 3, 4, 6)
num_data <- data[, num_cols]
zscoredfile <- scale(num_data)
colnames(zscoredfile) <- c("ZL", "ZR", "ZF", "ZM", "ZC")
```
在这个例子中,`num_cols`是一个包含数值型变量列索引的向量。然后,你可以使用`data[, num_cols]`选择这些列并将其存储在`num_data`中。最后,你可以使用`scale()`函数对`num_data`进行标准化,并将结果存储在`zscoredfile`中。
相关问题
注释test2 <- as.data.frame(test[, cols]) colnames(test2) <- colnames(learn2[-ncol(learn2)]) test_predict <- as.vector(predict(z, test2)$x) test_predict <- rev * test_predict poly_func <- get_fisher_poly_func(a, cnames, b) Y <- learn[, ncol(learn)] mroc <- roc(Y, model_predict, plot = F, main = main, direction = "<", levels = c(0L, 1L) ) auc <- as.numeric(split(mroc$auc, "curve: ")[1]) thre_opt <- coords(mroc, "best", ret = c("threshold"), transpose = TRUE)[1] coords <- coords(mroc, thre_opt, "threshold", ret = c( "sensitivity", "specificity", "accuracy", "ppv", "npv" ), transpose = TRUE ) model_sens <- format(coords[1], digits = 4) model_spec <- format(coords[2], digits = 4) model_accu <- format(coords[3], digits = 4) model_ppv <- format(coords[4], digits = 4) model_npv <- format(coords[5], digits = 4) model_auc <- format(auc, digits = 4) Y <- test[, ncol(test)] mroc <- roc(Y, test_predict, plot = F, main = main, direction = "<", levels = c(0L, 1L) ) auc <- as.numeric(split(mroc$auc, "curve: ")[1]) coords <- coords(mroc, thre_opt, "threshold", ret = c( "sensitivity", "specificity", "accuracy", "ppv", "npv" ), transpose = TRUE )
这段代码看起来是在进行机器学习模型的评估,其中使用了ROC曲线和AUC指标来评估模型的性能。首先,使用了测试集数据test来进行预测,并计算了预测结果的AUC值。然后,从ROC曲线上获取了最佳阈值,并计算了在该阈值下的灵敏度、特异度、准确度、阳性预测值和阴性预测值等指标。最后,将这些指标的值进行格式化,并保存在model_sens、model_spec、model_accu、model_ppv和model_npv变量中,同时将AUC值格式化后保存在model_auc变量中。
在R中,运行以下代码时:# 生成随机数据集 set.seed(1) data <- matrix(rnorm(50*30), nrow = 50) colnames(data) <- paste0("V", 1:30) y1 <- data %*% rnorm(30, mean = 2, sd = 0.5) y2 <- data %*% rnorm(30, mean = 1, sd = 0.3) y3 <- data %*% rnorm(30, mean = 3, sd = 0.7) # 线性回归模型 data <- as.data.frame(data) lm.fit1 <- lm(y1 ~ ., data = data) lm.fit2 <- lm(y2 ~ ., data = data) lm.fit3 <- lm(y3 ~ ., data = data) data <- as.data.frame(lapply(data, as.numeric)) # 计算 CV 值 library(boot) cv.error1 <- cv.glm(data, lm.fit1)$delta[1]。出现了以下问题:Error in model.frame.default(formula = y1 ~ ., data = list(V1 = c(-0.626453810742332, : 变数的长度不一样('V1')。。请从头至尾对代码的表达逻辑进行更改,并解决该问题
根据错误提示,出现问题的是变量的长度不一致。错误发生在最后一行代码,因为在前面的代码中,data已经被转换为data.frame类型,并且其中所有变量的长度应该是一致的。因此,问题可能出现在数据生成的过程中。
可以尝试以下修改,将数据生成的过程和变量命名的过程分开:
```R
# 生成随机数据集
set.seed(1)
data <- matrix(rnorm(50*30), nrow = 50)
y1 <- data %*% rnorm(30, mean = 2, sd = 0.5)
y2 <- data %*% rnorm(30, mean = 1, sd = 0.3)
y3 <- data %*% rnorm(30, mean = 3, sd = 0.7)
# 将数据转换为data.frame类型,并且为变量命名
data <- as.data.frame(data)
colnames(data) <- paste0("V", 1:30)
# 线性回归模型
lm.fit1 <- lm(y1 ~ ., data = data)
lm.fit2 <- lm(y2 ~ ., data = data)
lm.fit3 <- lm(y3 ~ ., data = data)
# 将数据转换为numeric类型
data <- as.data.frame(lapply(data, as.numeric))
# 计算 CV 值
library(boot)
cv.error1 <- cv.glm(data, lm.fit1)$delta[1]
```
这样可以确保数据的每一列都被正确地命名,并且在生成数据时也不会出现问题。如果还有其他问题,可以再进一步检查。
阅读全文
相关推荐

















