从每个数据帧子集中减去第一个值

时间:2013-06-07 19:36:42

标签: r

我想从该子集中的每个值中减去数据帧每个子集中的最小值,即

A <- c(1,3,5,6,4,5,6,7,10)
B <- rep(1:4, length.out=length(A))
df <- data.frame(A, B)
df <- df[order(B),]

减法会给我:

  A B
1 0 1
2 3 1
3 9 1
4 0 2
5 2 2
6 0 3
7 1 3
8 0 4
9 1 4

2 个答案:

答案 0 :(得分:6)

我认为您显示的输出不正确。无论如何,根据你的解释,我认为这就是你想要的。这使用ave基函数:

within(df, { A <- ave(A, B, FUN=function(x) x-min(x))})
  A B
1 0 1
5 3 1
9 9 1
2 0 2
6 2 2
3 0 3
7 1 3
4 0 4
8 1 4

当然还有其他选择,例如plyrdata.table

答案 1 :(得分:3)

回应Arun上面的评论,我认为您的预期产量可能会被取消。在任何情况下,您都应该可以使用tapply来计算子集,然后使用match将这些子集与原始值对齐:

subs <- tapply(df$A, df$B, min)

df$A <- df$A - subs[match(df$B, names(subs))]

df
  A B
1 0 1
5 3 1
9 9 1
2 0 2
6 2 2
3 0 3
7 1 3
4 0 4
8 1 4