2017-08-31 63 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]))