在数据框中,我想从每列的每个元素中减去每列的平均值。
示例数据帧:
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
参数来实现这一点。
发布于 2014-11-01 23:37:38
sapply(df, function(x){x-mean(x)})
发布于 2014-11-01 22:31:22
这里有一种方法:
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
发布于 2014-11-01 22:33:02
要保留data.frame结构,您可以执行以下操作:
as.data.frame(Map(`-`, df, mu))
或
sweep(df, 2, mu)
还有一个非常方便的scale
函数,但它可以将您的数据转换为矩阵:
scale(df, center = TRUE, scale = FALSE)
如果您不介意转换为矩阵,那么您还可以这样做:
t(t(df) - mu)
https://stackoverflow.com/questions/26693922
复制相似问题