如何从r中一组的所有值中减去最大值

how to subtract the max value from all values of a group in r

我目前有一个看起来像这样的数据框

tree cookie age
C1T1   A    113
C1T1   B    108
C1T1   C     97
C1T2   A    133
C1T2   B    110
C1T2   C    100

我想用每个 cookie 的给定年龄减去每棵树的最大年龄(因此从 C1T1 中的 113、108 和 97 中减去 113,从 C1T2 中的 133、110 和 100 中减去 133)。然后我想将新值保存为同一数据框中的一列。所以它看起来像:

tree cookie age new_age
C1T1   A    113  0
C1T1   B    108  5
C1T1   C    97  16

如有任何关于如何执行此操作的建议,我们将不胜感激!

我们可以利用 mutate 在按 'tree' 分组后创建新的列,即取 max 的差值 (-) 'age' 和每个 'age' 值创建 'new_age'

library(dplyr)
df1 <-  df1 %>%
           group_by(tree) %>%
           mutate(new_age = max(age) - age)

-输出

df1
# A tibble: 6 x 4
# Groups:   tree [2]
#  tree  cookie   age new_age
#  <chr> <chr>  <int>   <int>
#1 C1T1  A        113       0
#2 C1T1  B        108       5
#3 C1T1  C         97      16
#4 C1T2  A        133       0
#5 C1T2  B        110      23
#6 C1T2  C        100      33

或在 base R 中与 ave

df1$new_age <- with(df1, ave(age, tree, FUN = max) - age)

数据

df1 <- structure(list(tree = c("C1T1", "C1T1", "C1T1", "C1T2", "C1T2", 
"C1T2"), cookie = c("A", "B", "C", "A", "B", "C"), age = c(113L, 
108L, 97L, 133L, 110L, 100L)), class = "data.frame", row.names = c(NA, 
-6L))