2017-08-31 83 views
3

的最大的區別比方說,我有一個數據幀:爲每列,計算它和其他

x <- data.frame(a=c(1,2,3), b=c(2,3,2), c=c(4,5,1)) 
# a b c 
#1 1 2 4 
#2 2 3 5 
#3 3 2 1 

對於每一列,我想計算和的最大那之間的區別其他列:

# Desired result: 
# a b c 
#1 -3 -2 2 
#2 -3 -2 2 
#3 1 -1 -2 

例如,(1,1)項,這是1,因爲第一行,a = 1,並max(b,c) = 4,所以1 - 4 = -3

請注意,我不一定知道數據框的列數,所以可能會有任意多列。

+0

最大(b,c)= 5。儘管意圖很明確,但您所期望的結果與顯示的不正確。 –

回答

6

這應該在任何數量的列工作:

sapply(1:ncol(x), function (i) { 
    x[,i] - do.call(pmax, x[,-i]) 
}) 
+0

yikes。 'do.call'做到了,我不太確定爲什麼直接調用'pmax'不起作用。 :| – daikonradish

+0

'pmax'期望向量作爲單獨的參數傳入,例如, 'pmax(x [,2],x [,3],x [,4])''。使用'do.call',我們可以將一個列表(包括一個數據框)分離到它的組件中,並將它們傳遞給一個函數,就像我們單獨指定每個列表一樣。 –

0

如果你想要一個dplyr解決方案與位RC索引,您可以使用transmute生成一個新的數據幀,或mutate添加到您的現有的數據幀。

x <- data.frame(a=c(1,2,3), b=c(2,3,2), c=c(4,5,1)) 
x %>% transmute(a = a-max(x[,-1]), 
       b = b-max(x[,-2]), 
       c = c-max(x[,-3]))