使用这些数据:
set.seed(1); n = 50; x1 = rnorm(n, 10, 3); x2 = rnorm(n, 15, 3); x3 = rnorm(n, 20, 3)
dataframe = data.frame(x1,x2,x3)
我想通过以下方式重现中心(无缩放):
centered = scale(dataframe, scale=F)
使用扫描功能。但我收到此错误消息:
sweep(dataframe, 2, mean, "-")
Error in as.vector(x, mode) :
cannot coerce type 'closure' to vector of type 'any'
我尝试使用相同的错误消息将数据帧格式更改为矩阵,但没有成功。
我误解了什么?
答案 0 :(得分:3)
mean
是一个函数名称,在sweep
和-
中使用它意味着有两个函数。但是,根据?sweep
,用法是
sweep(x,MARGIN,STATS,FUN =“ - ”,check.margin = TRUE,...)
所以,mean
可能是“STATS”。它可以是列均值向量的对象名称(虽然OP的帖子中不清楚)。如果我们提供“STATS”作为列均值(colMeans(dataframe)
),它将通过列均值向量的相应值对“数据帧”的每一列进行减法(-
),即< / p>
res <- sweep(dataframe, 2, colMeans(dataframe), "-")
head(res, 2)
# x1 x2 x3
#1 -2.1807063 0.8423383 -1.4036437
#2 0.2495851 -2.1880585 0.5838039
head(centered, 2)
# x1 x2 x3
#[1,] -2.1807063 0.8423383 -1.4036437
#[2,] 0.2495851 -2.1880585 0.5838039
以下是另一个示例,通过将sweep
指定为2来显示MARGIN
如何工作。我们创建vector
('v1'),length
等于'data.frame'('d1')
v1 <- 1:3
d1 <- data.frame(Col1 = 1:5, Col2= 6:10, Col3 = 11:15)
sweep(d1, 2, v1, "-")
# Col1 Col2 Col3
#1 0 4 8
#2 1 5 9
#3 2 6 10
#4 3 7 11
#5 4 8 12
它在'd1'的第一列与'v1'的对应元素之间进行-
,第二列与第二个元素'v1'之间进行等等。但是,它不能用另一个函数来做对同一数据集进行一些操作并将其作为“STATS”向量返回,以在数据集和已转换的数据集之间执行FUN
,除非我们明确地执行此操作,如前面的解决方案中所示。
sweep(d1, 2, mean, "-")
#Error in as.vector(x, mode) :
#cannot coerce type 'closure' to vector of type 'any'
dataframe <- data.frame(x1, x2, x3)