R错误消息中的函数sweep()

时间:2016-05-04 19:48:34

标签: r

使用这些数据:

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'

我尝试使用相同的错误消息将数据帧格式更改为矩阵,但没有成功。

我误解了什么?

1 个答案:

答案 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)