2

对不起,令人困惑的标题......这是我想要做的一个可能的解决方案:

> df <- data.frame(a=c(1,2,3),b=c(4,5,6))
> v <- colMeans(df)

> df
  a b
1 1 4
2 2 5
3 3 6

> v
a b 
2 5 

> t(t(df)-v)
      a  b
[1,] -1 -1
[2,]  0  0
[3,]  1  1

但是数据框将具有命名的列和行并且非常大。这就是为什么我对这个解决方案不满意,并且想知道是否有一个程序化的解决方案(当然)不诉诸循环并且不需要笨拙的双转置(甚至可能整齐地适合单个线)。

4

3 回答 3

8

您想纠正数据框中的所有列吗?

df <- scale(df, center=TRUE, scale=FALSE)

如果有不是数字的列(因子和字符),那么您必须测试它们:

numeric <- sapply(df, is.numeric)
df[numeric] <- scale(df[numeric], center=TRUE, scale=FALSE)

请注意,这会将您的 df 转换为矩阵作为缩放的一部分。如果您不希望发生转换,您还可以执行以下操作:

df[] <- lapply(df, function(x) x - mean(x))
于 2013-08-05T19:18:45.227 回答
1

另外的选择:

sweep(df, 2, v)
于 2015-10-14T07:08:18.173 回答
0

在 Hong Ooi 的回答中,您可以直接data.frame使用:

df <- data.frame(scale(df, center=TRUE, scale=FALSE))
于 2018-08-21T07:37:55.717 回答