如何在一个组中应用一个函数,该函数取决于该组中的哪一行拥有一个值?
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))
我有一个如下所示的数据集,其中每个 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))