如何在一个组中应用一个函数,该函数取决于该组中的哪一行拥有一个值?

How to apply a function within a group that depends on which row within that group holds a value?

我有一个如下所示的数据集,其中每个 ID 有 3 个级别,其中一个级别有一个值(该 ID 内的所有其他级别均为 0):

ID level value
1  1     0
1  2     0
1  3     1
2  1     0
2  2     1
2  3     0

我需要 return 一个类似的数据框,其中包含一个附加列,用于指定 ID 中哪一行的值为 1。在本例中:

ID level value which
1  1     0     3
1  2     0     0
1  3     1     0
2  1     0     2
2  2     1     0
2  3     0     0

我觉得我应该能够通过 group_by(ID) 以某种方式创建它,然后基于引用相对于组的行的 case_when 进行变异(即如果它是第一行、第二行或第三行),但我不知道它应该如何工作。

非常感谢任何建议!

您可以使用 which 或更好的 which.max,保证 return 只有 1 个值。

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(which = which.max(value) * +(row_number() == 1))

#     ID level value which
#  <int> <int> <int> <int>
#1     1     1     0     3
#2     1     2     0     0
#3     1     3     1     0
#4     2     1     0     2
#5     2     2     1     0
#6     2     3     0     0

+(row_number() == 1)是为了确保which的值只分配给组中的第1行,其余所有行都是0。

我们可以使用base R

df1$Which <-  with(df1, tapply(as.logical(value), ID,
        FUN = which)[ID] * !duplicated(ID))

-输出

df1
#  ID level value Which
#1  1     1     0     3
#2  1     2     0     0
#3  1     3     1     0
#4  2     1     0     2
#5  2     2     1     0
#6  2     3     0     0

ave

的另一个选项
df1$Which <- with(df1, ave(as.logical(value), ID, FUN = which) * !duplicated(ID))