2013-08-05 63 views
1

很抱歉的混亂標題...這裏是我想用一個可能解決方案做到:如何逐行減去保持df數據幀(df)列平均值的向量?

> 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 

但數據幀將有一個名爲列和行是相當大的。這就是爲什麼我對這個解決方案感到不舒服,並想知道是否有一個程序化的方法,當然不會訴諸循環,並且不需要笨拙的雙重換位(甚至可能適合整齊線)。

回答

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

正是我一直在尋找非常感謝! – Raffael

1

另一種選擇:

sweep(df, 2, v) 
相關問題