R对数据框的每一行和每列应用计算

时间:2014-11-01 22:27:50

标签: r apply sapply

在数据框中,我想从该列的每个元素中减去每列的平均值。

示例数据框:

x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(2,3,2,3,2,3,2,3,2,3)
z <- c(100,200,300,400,500,600,700,800,900,1000)
df <- data.frame(x, y, z)

# get the mean of each column
mu <- colMeans(df)

我认为我需要使用sapply,类似于:

df_norm <- df
df_norm[,1] <- sapply(df[,1], function(x) (x-mu[1]))
df_norm[,2] <- sapply(df[,2], function(x) (x-mu[2]))
df_norm[,3] <- sapply(df[,3], function(x) (x-mu[3]))

但我无法弄清楚如何在一行代码中编写FUN参数来执行此操作。

3 个答案:

答案 0 :(得分:2)

以这种方式:

do.call(cbind,lapply(df,function(col)col-mean(col)))
#          x    y    z
#  [1,] -4.5 -0.5 -450
#  [2,] -3.5  0.5 -350
#  [3,] -2.5 -0.5 -250
#  [4,] -1.5  0.5 -150
#  [5,] -0.5 -0.5  -50
#  [6,]  0.5  0.5   50
#  [7,]  1.5 -0.5  150
#  [8,]  2.5  0.5  250
#  [9,]  3.5 -0.5  350
# [10,]  4.5  0.5  450

答案 1 :(得分:2)

要保留data.frame结构,您可以执行以下操作:

as.data.frame(Map(`-`, df, mu))

sweep(df, 2, mu)

还有scale函数非常方便,但它确实将数据转换为矩阵:

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

如果您不介意转换为矩阵,那么您也可以这样做:

t(t(df) - mu)

答案 2 :(得分:2)

sapply(df, function(x){x-mean(x)})