组的最大值和最小值的差异

时间:2017-03-10 14:28:28

标签: r

我有以下数据框

v1  v2  v3
a   2   5
b   5   3
c   2   1
d   2   1
e   1   2
a   2   4
a   8   1
e   1   6
b   0   1
c   2   8
d   1   5

使用R,我想计算V1的每个唯一值,即max V3和min V3之间的差值。 预期:

Val max_min
a   “5-1”
b   “3-1”
c   “8-1”
d   “5-1”
e   “6-2”

我正在尝试使用  

 ddply(fil1, c("V1"), summarise,  max(V3) - min(V1))
但是,没有预期的结果。它在max_min中给出相同的值:整个数据帧的max(V3) - min(V3),而不是组。 我也试过
average
,但没有成功。

2 个答案:

答案 0 :(得分:3)

或在基地R,

MAX = aggregate(df$v3, list(df$v1), max)
MIN = aggregate(df$v3, list(df$v1), min)
MAX[,2] - MIN[,2]
[1] 4 2 7 4 4

以上的一个衬里将是,

aggregate(v3 ~ v1, df, FUN = function(i)max(i) - min(i))
#  v1 v3
#1  a  4
#2  b  2
#3  c  7
#4  d  4
#5  e  4

我们也可以使用tapply来显示输出,如下所示,

with(df, tapply(v3, list(v1), function(i) max(i)-min(i)))
#a b c d e 
#4 2 7 4 4 

答案 1 :(得分:0)

你也可以去split

lapply(split(df$v3, df$v1), function(a) max(a)-min(a))

# $a
# [1] 4

# $b
# [1] 2

# $c
# [1] 7

# $d
# [1] 4

# $e
# [1] 4

如果你坚持看到你定义的输出:

ls <- lapply(split(df$v3, df$v1), function(a) max(a)-min(a))
data.frame(Val=names(ls), max_min=unlist(ls))

#  Val max_min
#a   a       4
#b   b       2
#c   c       7
#d   d       4
#e   e       4