【问题标题】:subtract first value from each subset of dataframe从数据帧的每个子集中减去第一个值
【发布时间】:2013-06-07 19:36:41
【问题描述】:

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

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

【问题讨论】:

  • 第一列第4行(4,1)不应该是0吗?另外 (7,1) 应该是 0?

标签: r


【解决方案1】:

我认为您显示的输出不正确。无论如何,根据您的解释,我认为这就是您想要的。这使用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

【讨论】:

  • 哇,很快,谢谢 Arun,先出块。 +1 是的,我的手工数学很差。
【解决方案2】:

呼应上面 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

【讨论】:

  • (+1) 您也可以直接执行(在这种情况下):unlist(tapply(df$A, df$B, function(x) x - min(x)))(因为它们已经被订购)。在大多数情况下,ave 因此非常有用。它以相同的顺序给出输出。
  • 谢谢两位,对我来说真的很方便。毫无疑问,我会看到很多用处。
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
相关资源
最近更新 更多