2

次のようなデータフレームがあります。

 d

  year total  file
  1999        3931.12000 A
  2002        4273.71020 A
  2005        4601.41493 A
  2008        4101.32100 A
  1999         346.82000 B
  2002         134.30882 B
  2005         130.43038 B
  2008          88.27546 B

ファイルごとに決定される各グループの合計とその最小値の差が必要です。
私は最小値を取得することを考えることができます:

 tapply(d$total, d$file, min)

しかし、最小値を差し引いたベクトルを取得する賢明な方法は考えられません。

4

2 に答える 2

4

私はお勧めwithinaveます。このようなもの:

within(mydf, {
  tot2 <- ave(total, file, FUN = function(x) x - min(x))
})
#   year      total file      tot2
# 1 1999 3931.12000    A   0.00000
# 2 2002 4273.71020    A 342.59020
# 3 2005 4601.41493    A 670.29493
# 4 2008 4101.32100    A 170.20100
# 5 1999  346.82000    B 258.54454
# 6 2002  134.30882    B  46.03336
# 7 2005  130.43038    B  42.15492
# 8 2008   88.27546    B   0.00000

または、「data.table」を使用:

library(data.table)
DT <- data.table(mydf)
DT[, tot2 := total - min(total), by = file][]

または、「dplyr」で:

library(dplyr)
mydf %>% group_by(file) %>% mutate(tot2 = total - min(total))
于 2014-07-27T09:50:48.653 に答える
2

を使用してtapply

 a1 <- tapply(d$total, d$file, min)
 d$total-a1[match(d$file, names(a1))]
 #     A         A         A         A         B         B         B         B 
#  0.00000 342.59020 670.29493 170.20100 258.54454  46.03336  42.15492   0.00000 
于 2014-07-27T10:04:49.220 に答える