如何逐行减去一个向量,保持df中数据帧(df)列的平均值?

时间:2013-08-05 19:15:48

标签: r dataframe

对于令人困惑的标题感到抱歉...这是我想用可能的解决方案做的事情:

> 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

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

另一种选择:

sweep(df, 2, v)

答案 2 :(得分:0)

在Hong Ooi的答案中,您可以使用以下方法直接获取data.frame

df <- data.frame(scale(df, center=TRUE, scale=FALSE))