2014-11-01 60 views
1

在數據框中,我想從該列的每個元素中減去每列的平均值。R在數據框的每一行和列中應用計算

示例數據幀:

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參數來做到這一點在一行代碼中。

回答

2
sapply(df, function(x){x-mean(x)}) 
+0

現在爲什麼我沒有想到..! – tospig 2014-11-02 00:04:51

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 
2

爲了保持data.frame結構,你可以這樣做:

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

sweep(df, 2, mu) 

也有scale功能是非常方便,但它確實將您的數據轉換爲矩陣:

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

如果你不介意的話轉換成一個矩陣,那麼你也可以這樣做:

t(t(df) - mu) 
+0

優秀的,謝謝。我也完全忘記了矩陣操作。 – tospig 2014-11-01 23:37:28

相關問題