R语言 我无法对数据框使用scale()函数[已关闭]

rta7y2nd  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(219)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

昨天关门了。
这篇文章是8小时前编辑并提交审查的。
Improve this question

我不知道这里有什么问题。这里trainX是一个 Dataframe ,只有数值,但当我使用刻度时仍然是这样()函数来规范它,它说,参数x应该是一个数值。而最烦人的是,当我的导师在做同样的事情时,那么没有问题发生,但当我尝试同样的事情时,它显示x应该是一个数值。

dced5bon

dced5bon1#

预付款scale * 可以 * 在整个data.frame上工作,如果所有列都是数字的,例如,scale(mtcars),逐列或对整个对象运行scale应该返回相同的结果(比较sapply(mtcars, scale)scale(mtcars))。我认为SALAR最大的收获是的建议是,当您的一个或多个列不匹配时,您将看到来自scale的错误;比较,scale(iris),其中一列是factor并且不应当被缩放。

我认为最大的收获是你应该只缩放你知道是数值的列。我提供了两种机制(base和dplyr)来实现这一点。确保当你确定要缩放的列时,你不包括任何整数列,在那里缩放可能会破坏它们(例如,mtcars$cyl可能是一个问题)
我猜:

isnum <- sapply(data, isnum)
trainX_s <- trainX # a copy
trainX_s[isnum] <- data.frame(lapply(trainX[isnum], scale))

scale函数自称为处理 “Matrix-like Objects”,而帧不是这样,上面的lapply函数迭代每一列并独立缩放它们。
如果您已经在使用dplyr,那么您可以执行类似下面这样的一步操作:

library(dplyr)
trainX_s <- mutate(trainX, across(where(is.numeric), ~ scale(.)))

根据数据的不同,如果整数是离散/有序(或离散/分类)的,您可能需要防止缩放整数,不幸的是is.numeric(1L)为真,在这种情况下,您可能需要

isnum <- sapply(trainX, function(z) is.numeric(z) & !is.integer(z))
mccptt67

mccptt672#

我猜您的数据中混合了字符串和数字列。要确保您的数据具有正确的类型(numericcharacter,..),或者一些数字数据已更改为另一种类型,并将其恢复为原始类型,请使用type.convert()并将scale应用于您的数据:

library(tidyverse)

trainX_s <- type.convert(trainX, as.is=T)
trainX_s <- mutate_if(trainX_s, is.numeric, scale)

相关问题